如何配置ImageMagick不使用任何临时文件?

Zac*_*c B 8 c++ perl imagemagick temporary-files tmp

我试图在不触及文件系统的情况下运行ImageMagick:从内存/网络读取图像数据,并将其作为blob写回套接字.

但是,ImageMagick不断尝试编写临时文件,这些文件由于测试中止/失败而填满我的测试系统,或者在磁盘速度极慢的系统上引起问题:这是一个奇怪的约束,但我的许多转换主机都是嵌入式系统使用块设备,响应任何操作都非常慢,甚至是stat()s.

问题:

  1. 有没有办法配置ImageMagick在图像处理期间不接触磁盘?假设已经加载了ImageMagick将使用的所有必需模块,并且没有任何ImageMagick功能将处理输出到与文件系统通信的子进程用过的.

  2. 这样做有什么副作用?我可以处理不适合内存失败的处理,而不是回到磁盘上.

我正在使用C++或Perl ImageMagick API进行转换,而不是convert实用程序.但是,如果另一个绑定支持这一点,我很好地切换平台.

我试过的

  • 我已经设置了MAGICK_TEMPORARY_PATH各种各样的地方,包括/dev/nullPOSIX./dev/null有时似乎工作,但我的目标系统不是POSIX,所以我不确定我是否可以指望它.而不是愚弄临时文件管理系统,我更喜欢我可以信任的东西,首先禁用对临时文件的需求.
  • 我已经使用了该registry:temporary-path选项,结果相似.
  • 将各种临时路径选项设置为不存在/不可用的位置(例如,/dev/null或者不可写的位置)通常会导致在我的程序启动的目录中创建临时文件.如果该目录是不可写的,我已经看到临时文件在系统/tmp目录中创建,即使代码被告知不使用它.这些似乎发生在特殊情况下(例如segfaulting/OOMing/kill -9'd情况),所以我认为通常可以在这些地方创建文件,但通常会清理它们.

小智 2

技巧是将MAGICK_DISK_LIMIT=0MAGICK_AREA_LIMIT/设置MAGICK_AREA_LIMIT为大于程序所需的最大内存的值。

#!/usr/bin/perl
BEGIN {
    $ENV{'MAGICK_DISK_LIMIT'  }='0';
    $ENV{'MAGICK_AREA_LIMIT'  }='1Mb';
    $ENV{'MAGICK_MEMORY_LIMIT'}='1Mb';
}

use Image::Magick;    
my $img = Image::Magick->new();
my $err = $img->Read('in.png');
die $err if $err;
Run Code Online (Sandbox Code Playgroud)

如果 ImageMagick 超过此内存限制,它将终止并显示如下消息:

Exception 450: Memory allocation failed `in.png' @ error/png.c/MagickPNGErrorHandler/1645 at ./imagemem.pl line 11.
Run Code Online (Sandbox Code Playgroud)

您可以通过运行查看 ImageMagick 的默认限制identify -list resource