Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ImageMagick`resize`:3分钟可输出10种不同的大小。。。。如何提高性能?_Image_Performance_Image Processing_Imagemagick - Fatal编程技术网

ImageMagick`resize`:3分钟可输出10种不同的大小。。。。如何提高性能?

ImageMagick`resize`:3分钟可输出10种不同的大小。。。。如何提高性能?,image,performance,image-processing,imagemagick,Image,Performance,Image Processing,Imagemagick,我正在做一个项目,其中涉及从用户上传单反相机图像,并调整到10个不同的大小 我正在使用ImageMagick在服务器端调整大小。。。。但是处理图像要花太多时间。。超过3分钟。。。最终用户在等待完成时会感到恼怒 所以我想减少时间,提高性能。。。。请帮我修改一下 当我尝试在Flickr、500px和facebook上上传相同的4mb-6mb文件时,他们用的时间更短 我不是一个专业的程序员。。。。。我只是使用简单的机制,通过输入上传文件,并处理服务器端控制器作用下的图像 我使用以下代码调整每个图像的大

我正在做一个项目,其中涉及从用户上传单反相机图像,并调整到10个不同的大小

我正在使用ImageMagick在服务器端调整大小。。。。但是处理图像要花太多时间。。超过3分钟。。。最终用户在等待完成时会感到恼怒

所以我想减少时间,提高性能。。。。请帮我修改一下

当我尝试在Flickr、500px和facebook上上传相同的4mb-6mb文件时,他们用的时间更短

我不是一个专业的程序员。。。。。我只是使用简单的机制,通过输入上传文件,并处理服务器端控制器作用下的图像

我使用以下代码调整每个图像的大小

下面是我的控制器处理图像的操作

根据建议更新了下面的代码,大约需要1.6分钟才能处理到代码中的以下差异大小

以下是上述代码的工作示例:


我不是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如果原始.Width,您的代码只写入一个图像-但您说您有10个不同的大小…也许可以向我们展示您如何创建其他9个图像,因为可以删除所有10个图像大小通用的过滤/重采样,或并行化,或删除中间文件…相同的代码拷贝粘贴9个大小,只需更改大小值,如1200,1000800600500300100,75和反锐化掩码值的小更改我不做C,也许@dlemstra会帮你看一看。这篇文章:,可能会给你一些有趣的信息。在每次迭代中,你应该使用以前调整大小的图像作为源。这肯定会降低计算量。特别是对于最终图像,不要将其调整为1600到160075但是100到75。非常感谢你的详细解释…如果你不介意的话,我有一些疑问…比如,由于大量用户请求或使用imagemagick的命令行上传,会有任何进程锁定、终止或死亡…还有一个是使用命令行或任何其他可用方法的唯一方法…是否有通过mvc的magick.net命令的选项…请向我推荐这些t中最好的
欣我真的很抱歉,我对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 ...