请考虑使用以下命令来使用 imagemagick 包:
sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg
现在test1.jpg
是一个相当大图像(12.5MB),但并非闻所未闻的大小,但我使用的服务器只有 1G 内存(亚马逊 EC2 t2.micro如果有帮助的话)
没有抛出任何错误,但也没有test2.jpg
创建任何内容。我已经用较小的图像测试过,效果很好。我原本以为 1G 内存足以管理调整大小,但也许不够?
我有什么选择,我是否需要获得更多内存或者我缺少了什么?
欢迎任何建议!
要求编辑
strace 输出显示:+++ killed by SIGKILL +++
以及很多看起来正常的命令(打开/usr/share/local
和读取长字符串,我认为是图像数据)
免费提供给我:
total used free shared buffers cached
Mem: 1016292 278348 737944 6412 460 13356
-/+ buffers/cache: 264532 751760
Swap: 0 0 0
因此看起来好像没有启用交换,所以我将研究创建一个交换文件来看看这是否能解决我的问题。
文件给我:
testprint10Mbv2.jpg: JPEG image data, EXIF standard
我也会粘贴完整的 /path/to/img,但不幸的是它包含敏感数据(客户电子邮件地址等)
答案1
答案2
通过添加适当的交换空间,问题得到了解决。为了完整起见,让我总结一下convert
在低内存系统上运行 Image Magick 处理大型文件时,或者在没有可用交换空间或交换空间太小时,我们可以使用的其他选项。
下面提到的方法在Image Magick手册中有详细阐述:
真正海量的图像处理
概括:
使用选项限制内存使用量
-limit
这样,一旦超出给定的内存限制,Image Magick 就会创建一个临时文件用于图像处理。这需要 Image Magick 对临时文件目录的写权限。我们可以在环境变量中指定创建临时文件的任何路径。
MAGICK_TMPDIR
示例命令可能类似于以下内容:env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
在磁盘而不是 RAM 上工作会大大降低处理速度。
使用“内存映射磁盘文件”
创建 MPC 文件需要资源,但从 MPC 文件转换则不需要那么多资源。因此,如果我们需要多次转换具有不同参数的同一源,则可以考虑这一点。工作流程可能类似于此:
convert huge.jpg huge.mpc convert huge.mpc -resize 50% big.png convert huge.mpc -resize 20% small.png convert huge.mpc -resize 5% thumb.png
使用
stream
使用溪流声称仅处理源图像的一部分,而无需将整个图像加载到内存中。
stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
在上面的例子中,
-extract
选项采用 Image Magick 定义的大小和偏移值几何学。我们必须将图块重新粘在一起才能获得完整的缩放图像。不幸的是溪流不适用于所有图像格式,但应该可以很好地适用于 JPEG 图像。