使用ImageMagick转换进行大型图像处理 - 需要更多吞吐量

时间:2011-07-26 19:22:39

标签: image imagemagick throughput

我正在将一些较大的图像从多图像(金字塔)tif转换为png格式。来自最大图像上“identity -verbose”的报告的显着部分在这里:

Image: 
  Format: TIFF (Tagged Image File Format)
  Class: DirectClass
  Geometry: 72224x64080+0+0
  Resolution: 72x72
  Print size: 1003.11x890
  Units: PixelsPerInch
  Type: TrueColor
  Base type: TrueColor
  Endianess: MSB
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
    ...
  Page geometry: 72224x64080+0+0
    ...
  Scene: 2 of 12
  Compression: JPEG
  Orientation: TopLeft
  Properties:
    ...
  Filesize: 1.389GBB
  Number pixels: 4.6281GB
  Pixels per second: 5.516MB
  User time: 218.277u
  Elapsed time: 13:60.020
  Version: ImageMagick 6.7.1-0 2011-07-06 Q16 http://www.imagemagick.org

我打算使用deepzoom编辑器为此图像生成Silverlight多尺度图像控件的输入。我的问题是如何在使用ImageMagick处理这些图像时让我的系统瘫痪 - 转换它们需要很长时间。我看了几篇文章,但我似乎无法到达任何地方。

某些系统和其他相关信息:

 OS: Windows 7 64 bit.
 CPU: Intel Core2 Duo E7300 @ 2.66, 2.67
 RAM: 4.0 GB
 PAGEFILE: 8-12GB on non-OS disk
 "MAGICK_TMPDIR": Yet another empty, non-os disk with 140GB available.

以下是“识别 - 列表资源”的结果:

 File         Area       Memory          Map         Disk    Thread
 ------------------------------------------------------------------
 1536     4.1582GB    15.491GiB    30.981GiB    unlimited         2

我正在运行此命令来提取上面引用的图像:

convert "myFN.tif[2]" -limit file 8192GB -limit thread 32 "myFN%d.png"

添加两个限制值似乎没有什么区别。当我运行它时,我平均大约10%的CPU利用率,并且页面文件提交大小为3BG。我几乎不能说它正在运行。

Q1)我还能做些什么来让ImageMagick使用更多系统资源吗?我发现的大多数“大图像”链接都提出了相反的问题。

Q2)更改位于此处的“policy.xml”值(例如文件):      C:\ Program Files \ ImageMagick-6.7.1-Q16 \ www \ source 似乎没有任何影响 - 这些变化没有出现在下一个“识别 - 列表资源”中。这有诀窍吗?

Q3)此任务的其他任何提示或想法?

谢谢, 大卫

4 个答案:

答案 0 :(得分:1)

对于(我的)图像,限制因素是像素缓存的大小,受设置“ MAGICK_AREA_LIMIT ”的限制。默认值4GB对于72224 x 64080来说还不够大 - 这需要至少4.4GB的设置 - 尝试“MAGICK_AREA_LIMIT = 8GB”。

如果您想控制ImageMagick对系统RAM和系统页面文件的影响,那么您可以使用“ MAGICK_MEMORY_LIMIT ”来限制它。实际上,由于像素高速缓存的回退位置是映射的存储器文件,因此不需要在那里使用大的限制,这些存储器文件与系统页面文件具有相同的效率数量级。尝试“MAGICK_MEMORY_LIMIT = 2GB”,以保持像素缓存不在那里(不是说它会去那里 - 它大于12GB。)

您希望像素缓存转到映射内存,因此请尝试“ MAGICK_MAP_LIMIT = 100GB”以利用您拥有的空间。内存映射文件将结束,而不是在系统临时目录中,而是在“ MAGICK_TMPDIR ”指定的目录中。

要获得额外的功劳,您也可以尝试使用Q8版本,因为您不需要16位颜色通道。你可以期待大约一半的磁盘io与该版本。

祝你好运! 大卫

答案 1 :(得分:1)

Imagemagick具有用于处理大文件(mpc)的格式。基本上将磁盘空间用于ram。转换时会生成两个文件.mpc.cache,您可以在较小的.mpc文件上运行imagemagick命令。这些文件只能在您当前的imagemagick版本上使用,因此不适合存档。

答案 2 :(得分:0)

与Q16版本相比,Q8版本使用一半的磁盘空间和时间来完成转换!此外,如果您要将图像分解为图块,则可以使用以下命令一步完成:

convert.exe" "WRL_15_1A.tif[2]" -crop 14409x15396 +repage -scene 0 "temp\WRL_15_1A%d.tif"

  • “[2]”调出第三张图像(最高的图像) 决议。)
  • -crop参数是宽度和高度的1/4 分别给我们16块瓷砖。
  • + repage将所有图块设置为origin(0,0)
  • “%d”对文件进行编号,从#set by开始 “-scene”。

答案 3 :(得分:0)

vips可以将金字塔形tiff直接转换为深层金字塔。它是免费的,非常快,不需要太多内存。

例如,我看到了:

$ vipsheader vips-pyr.tif 
vips-pyr.tif: 18008x22764 uchar, 3 bands, srgb, tiffload
$ time vips dzsave vips-pyr.tif x.zip$ time vips dzsave vips-pyr.tif x.zip
real    0m9.763s
user    0m19.700s
sys 0m4.644s
peak memory: 180mb

在一台小型笔记本电脑上,在10秒内转换为20,000 x 20,000 tiff。它正在编写一个包含金字塔的zip文件,因此您可以立即上传到服务器。内存使用与图像宽度成比例,所以它会做非常大的图像---我经常处理250,000 x 250,000像素的幻灯片。

这里有一篇博客文章介绍dzsave:

http://libvips.blogspot.co.uk/2013/03/making-deepzoom-zoomify-and-google-maps.html