ImageMagick`resize`:3分钟可输出10种不同的大小。。。。如何提高性能?
我正在做一个项目,其中涉及从用户上传单反相机图像,并调整到10个不同的大小 我正在使用ImageMagick在服务器端调整大小。。。。但是处理图像要花太多时间。。超过3分钟。。。最终用户在等待完成时会感到恼怒 所以我想减少时间,提高性能。。。。请帮我修改一下 当我尝试在Flickr、500px和facebook上上传相同的4mb-6mb文件时,他们用的时间更短 我不是一个专业的程序员。。。。。我只是使用简单的机制,通过输入上传文件,并处理服务器端控制器作用下的图像 我使用以下代码调整每个图像的大小 下面是我的控制器处理图像的操作 根据建议更新了下面的代码,大约需要1.6分钟才能处理到代码中的以下差异大小 以下是上述代码的工作示例:ImageMagick`resize`:3分钟可输出10种不同的大小。。。。如何提高性能?,image,performance,image-processing,imagemagick,Image,Performance,Image Processing,Imagemagick,我正在做一个项目,其中涉及从用户上传单反相机图像,并调整到10个不同的大小 我正在使用ImageMagick在服务器端调整大小。。。。但是处理图像要花太多时间。。超过3分钟。。。最终用户在等待完成时会感到恼怒 所以我想减少时间,提高性能。。。。请帮我修改一下 当我尝试在Flickr、500px和facebook上上传相同的4mb-6mb文件时,他们用的时间更短 我不是一个专业的程序员。。。。。我只是使用简单的机制,通过输入上传文件,并处理服务器端控制器作用下的图像 我使用以下代码调整每个图像的大
我不是C方面的专家,但我对ImageMagick有相当多的经验,所以我只是想帮你找到正确的方向,但可能无法给你确切的答案 您希望避免多次从磁盘读取图像,并一次又一次地重复相同的处理,尤其是在较高分辨率下。在命令行中,您可以按照以下几行实现代码:
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85%\
\( +clone -resize 2048x2048! -colorspace sRGB -unsharp 2x1+1.7+0.2 -write 0.jpg +delete \) \
\( +clone -resize 1200x1200! -colorspace sRGB -unsharp 1.6x0.5+1.7+0.25 -write 1.jpg +delete \) \
\( +clone -resize 1000x1000! -colorspace sRGB -unsharp 2.8x1+0.7+0.2 -write 2.jpg +delete \) \
\( +clone -resize 800x800! -colorspace sRGB -unsharp 2x1+0.7+0.02 -write 3.jpg +delete \) \
\( +clone -resize 600x600! -colorspace sRGB -write 4.jpg +delete \) \
\( +clone -resize 500x500! -colorspace sRGB -write 5.jpg +delete \) \
\( +clone -resize 300x300! -colorspace sRGB -write 6.jpg +delete \) \
\( +clone -resize 100x100! -colorspace sRGB -write 7.jpg +delete \) \
-resize 75x75 -colorspace sRGB 8.jpg
它在第一行中读取一次图像,在前面尽可能多地进行定向、剥离、colorspace Lab和Lanczos过滤,以便为其余步骤进行设置,然后,对于每个后续大小,它将预先Lanczosed的、已经是Lab space的图像内存克隆到内存,而不是磁盘,并进行过滤、模糊,调整大小和颜色空间转换,并将每个大小写入磁盘
使用5000 x 3500像素的原始图像,上述序列在合理规格的iMac上运行17秒。也许您可以看到如何使序列适应您的C环境。在最坏的情况下,也许您可以从C中退出并使用我的命令的变体
上面的代码没有利用并行化,但是避免了不必要的操作。另一种方法利用了所有CPU内核,并通过使用后台任务来并行化,注意每行的末尾,但必须重复一些操作,因此您可以考虑采用这种方式。
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 2048x2048! -colorspace sRGB -unsharp 2x1+1.7+0.2 0.jpg &
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 1200x1200! -colorspace sRGB -unsharp 2x1+1.7+0.1 1.jpg &
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 1000x1000! -colorspace sRGB -unsharp 2x1+1.7+0.2 2.jpg &
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 800x800! -colorspace sRGB -unsharp 2x1+1.7+0.2 3.jpg &
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 600x600! -colorspace sRGB -unsharp 2x1+1.7+0.2 4.jpg &
convert original.jpg -auto-orient -strip -colorspace Lab -filter lanczos -quality 85% -resize 500x500! -colorspace sRGB -unsharp 2x1+1.7+0.2 5.jpg &
convert original.jpg -auto-orient -strip -quality 85% -resize 300x300! 6.jpg &
convert original.jpg -auto-orient -strip -quality 85% -resize 100x100! 7.jpg &
convert original.jpg -auto-orient -strip -quality 85% -resize 75x75! 8.jpg &
wait # for all taks to complete
上面的脚本大约需要18秒。如果,我从本质上改变它,在这里所有的事情都是并行完成的&最后:
convert ... &
convert ... &
...
wait
为此,所有操作都是按顺序完成的,这就是您的代码所做的:
convert ...
convert ...
...
convert ...
它需要1分20秒,或者更长4倍
我的观点是,要么像我的第一个例子那样,以优化的顺序一次完成所有事情,要么并行完成所有事情——也许你可以使用C语言中的线程——很抱歉,我根本不知道这种语言或环境。正如Mark Setchell所说,你不应该一直从磁盘读取图像,而是克隆原始图像。模糊操作也是一种昂贵的操作,您只需要执行一次。并行执行循环也可能有帮助,但在我的机器上,这实际上比较慢 您的代码大致翻译为下面的示例。下次请随时在此处寻求帮助: 调整空洞大小 { 使用MagickImage original=new MagickImageoriginal.jpg { 原始。自动定向; 原版。脱衣舞; original.ColorSpace=ColorSpace.Lab; 原始。设置属性,72x72; 原件1,0.375; int[]size=newint[]{204811601024800640}; //Parallel.For0,大小.长度,delegateint索引 对于int i=0;i
欣我真的很抱歉,我对Windows了解不够,我在Unix/Linux中工作,无法回答您的问题。也许可以试着在这里问另一个问题…@kumar请不要忘记接受他的答案,以奖励德莱姆斯特拉的辛勤工作-点击计票旁边的空心绿色勾号/复选标记,这样做。但即使是@dlemstra建议的一个,整个过程也需要2.2分钟。。。我想再减少一点。。有没有办法做到这一点…@kumar你的机器需要2分钟,而我的低档桌面iMac可以在17秒钟内完成同样的工作,这看起来很奇怪。你能在你的服务器上试用我的命令行版本吗?您也可以单击问题下的“编辑”并粘贴到标识-版本和标识-列表配置的输出中,以便我可以查看您的设置。您运行的是什么硬件/软件?同样地,将此信息添加到您的原始问题中。@MarkSetchell因为我不是专业程序员,我不知道如何在c或mvc中使用imac命令行。。。。我试着用谷歌搜索,但没有找到解决办法。。。已尝试diagnostics.process方法,但没有错误无处理。。。请在这方面帮助我如何使用命令行或以任何其他方式提高速度。。。。我正在使用magick.net-q16-anycpu版本:7.0.0.0003 nuget软件包,并尝试将ImageMagick-6.8.9-8-q16-x86-windows.zip用于命令行。。。请帮帮我
convert ...
convert ...
...
convert ...