使用ImageMagick高效生成缩略图并进行转换

ens*_*are 12 imagemagick thumbnails imagemagick-convert

我希望用Python中的ImageMagick转换实用程序有效地生成各种大小的缩略图.我的一些图像文件非常大(约15MB JPG).

我可以做的一种方法是拍摄全尺寸图像,并从全尺寸图像生成各种缩略图,如下所示:

convert sample_image.jpg -resize 1024x768  sample_image-1024x768.jpg
convert sample_image.jpg -resize 800x600   sample_image-800x600.jpg
convert sample_image.jpg -resize 400x300   sample_image-400x300.jpg
convert sample_image.jpg -resize 200x150   sample_image-200x150.jpg
Run Code Online (Sandbox Code Playgroud)

但另一种方法是将图像彼此调整大小:

convert sample_image.jpg           -resize 1024x768  sample_image-1024x768.jpg
convert sample_image-1024x768.jpg  -resize 800x600   sample_image-800x600.jpg
convert sample_image-800x600.jpg   -resize 400x300   sample_image-400x300.jpg
convert sample_image-400x300.jpg   -resize 200x150   sample_image-200x150.jpg
Run Code Online (Sandbox Code Playgroud)

这样做有什么缺点,或者更好的方法吗?看来这会更有效率.

作为必然结果,是否有任何标志或"技巧"转换用途来加速这一过程?

Kur*_*fle 17

ImageMagick有一些技巧可以帮助您在想要处理大图像时以及当您想要从同一原件创建不同的输出时优化速度:

  1. 利用ImageMagick的mpr:{name}功能,它可以暂时将输入图像保存到指定的内存程序寄存器中,您可以在以后(处理时)读取数据的速度比硬盘上的速度快得多.

  2. 所有操作都在一个进程中调整操作,写出您需要的不同输出大小.

更好的消息是,您可以将这两者合并为一个命令.

因此,您不需要运行具有所有上下文切换开销的多个进程 - 一次完成所有操作.

以下示例还从原始图像中裁剪两个单独的区域,并从中创建重新调整大小的缩略图,以显示IM可以在一个命令行中执行的操作数量.它当然也会输出您要求的尺寸.(当然,您需要一个非常大尺寸的输入图像才能使裁剪参数起作用).

convert                           \
  huge-original.jpg               \
 -quality 80                      \
 -colorspace rgb                  \
 +profile '*'                     \
 -filter Lanczos                  \
 -write mpr:copy-of-huge-original \
 +delete                          \
  mpr:copy-of-huge-original -crop '3000x2000+0+480'   -resize '200x125!>' -write thumb1-extract.jpg +delete \
  mpr:copy-of-huge-original -crop '2000x1500+280+220' -resize '75x75!>'   -write thumb2-extract.jpg +delete \
  mpr:copy-of-huge-original -resize '1024x768'  -write sample-1024x768.jpg +delete \
  mpr:copy-of-huge-original -resize '800x600'   -write sample-800x600.jpg  +delete \
  mpr:copy-of-huge-original -resize '400x300'   -write sample-400x300.jpg  +delete \
  mpr:copy-of-huge-original -resize '200x150'   -write sample-200x150.jpg  +delete \
  mpr:copy-of-huge-original -resize '163x163!>' -write sample-163x163.jpg
Run Code Online (Sandbox Code Playgroud)

更新

我现在才看到@JonathanOng提出的问题:如何将输出流式传输到<stdout>

假设你想要格式化为stdout也是JPEG,你可以试试这个:

convert                           \
  huge-original.jpg               \
 -quality 80                      \
 -colorspace rgb                  \
 +profile '*'                     \
 -filter Lanczos                  \
 +write mpr:copy-of-huge-original \
  mpr:copy-of-huge-original -crop '3000x2000+0+480'   -resize '200x125!>' +write thumb1-extract.jpg \
  mpr:copy-of-huge-original -crop '2000x1500+280+220' -resize '75x75!>'   +write thumb2-extract.jpg \
  mpr:copy-of-huge-original -resize '1024x768'  +write jpeg:- \
  mpr:copy-of-huge-original -resize '800x600'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '400x300'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '200x150'   +write jpeg:- \
  mpr:copy-of-huge-original -resize '163x163!>' +write jpeg:-
Run Code Online (Sandbox Code Playgroud)

这样每个变体都将转到stdout.你如何处理这些连续图像,取决于你...

注意,而不是写-write filename +delete你可以使用+write filename.它达到了相同的效果.


A.H*_*A.H 0

就我的观点而言,经过测试,将 1024x768 大小调整为 800x600 对重新缩放算法不利。由于整数 (2) 的倍数,下一次调整大小会更容易。

因此,出于质量原因,我个人认为,这是更好的:

convert sample_image.jpg -resize 1024x768  sample_image-1024x768.jpg
convert sample_image.jpg -resize 800x600   sample_image-800x600.jpg
convert sample_image-800x600.jpg   -resize 400x300   sample_image-400x300.jpg
convert sample_image-400x300.jpg   -resize 200x150   sample_image-200x150.jpg
Run Code Online (Sandbox Code Playgroud)