这是我的IM命令:
/usr/bin/convert
'src.tif'
-limit memory 0
-limit map 0
-limit file 0
-alpha transparent
-clip
-alpha opaque
-resize 800x600
'end.png'
2>&1
因此,这将通过剪切文件中给定的路径来删除TIFF的白色背景。它将调整大小并另存为透明PNG。
我没有从IM运行此错误。
但是,如果我使用PHP运行此命令以在大约13000个文件上执行它-有时会出现以下错误:
sh: line 1: 25065 Killed /usr/bin/convert \
'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \
-limit memory 0 -limit map 0 -limit file 0 -alpha transparent \
-clip -alpha opaque -resize 800x600 \
'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1
sh: line 1: 25702 Killed /usr/bin/convert \
'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \
-limit memory 0 -limit map 0 -limit file 0 -alpha transparent \
-clip -alpha opaque -resize 800x600 \
'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1
但更大的问题是:有些图片坏了。下面是左侧的“坏”图像,右侧是“好”图像(拖动/在深色背景上会更好地看到问题):
手动运行命令后,结果正常。仅在运行此PHP循环脚本时,才会提供错误的结果。(PHP循环脚本)
我以这种方式运行脚本:php55 run.php
。带find
as shell脚本的简单循环提供相同的结果。
因此,我在IM语篇服务器中进行搜索,询问,并在两台具有不同分布的计算机上运行此过程(Debian Wheezy,Ubuntu Server 14.04)
注意/编辑1:在终端中使用相同文件运行命令可提供理想的结果。
编辑2:在此处添加了示例TIFF文件
我不确定这是否是答案。就目前而言,这纯粹是猜测。所以这里...
通过将限制设置为一个0
值,基本上就是在告诉ImageMagick:“您的资源根本没有限制。您不需要关心任何限制。”
如果未设置任何限制怎么办?-limit ... 0
从命令中删除所有部分。在这种情况下,ImageMagick将使用其内置的默认值或其他定义的设置(这些设置可能包含在IM安装的policy.xml文件中,或者通过各种环境变量包含)。您可以使用以下命令查询系统的当前限制:
identify -list resource
在我的系统上,我得到以下值:
File Area Memory Map Disk Thread Throttle Time
---------------------------------------------------------------------------
192 4.295GB 2GiB 4GiB unlimited 1 0 unlimited
如果您确实将这些限制设置为与系统的实际可用资源相匹配的合理值,该怎么办?假设您拥有:8 GB的RAM,50 GB的可用磁盘空间以及磁盘卷上的大量可用inode。然后尝试将其设置为:-limit disk 10GB -limit memory 3GB -limit map 6GB
。
对于其所有处理和中间步骤,ImageMagick需要访问中间像素缓存存储器/存储,然后才能交付最终结果。
像素缓存存储的需求可以通过不同的资源来满足:
ImageMagick逐步利用所有这些资源:
磁盘存储很便宜,但也很慢:它比内存慢了三个数量级(一千倍)。通过使用内存映射到基于磁盘的缓存,可以提高一些速度(最多5倍)。
ImageMagick知道控制这些资源数量的各种方法:
内置默认值。这些限制是:768个文件,3GB的图像区域,1.5GiB内存,3GiB内存映射和18.45EB的磁盘空间。
policy.xml
配置文件。请查找您自己的policy.xml文件中的内容。用于convert -list policy
首先查找此文件的位置。然后使用cat /some/path/policy.xml
查看其内容。(该文件使用的XML语法不要忘记:任何封闭在<!--
和-->
是一个注释!)它也包含注释解释各种细节。该的policy.xml可以定义不仅仅是可用资源的限制很多更多的事情。如果在其中定义了默认值,则policy.xml中的设置优先于内置默认值。
环境变量。以下是可以限制IM资源的环境变量列表:(MAGICK_AREA_LIMIT
映像区域限制),MAGICK_DISK_LIMIT
(磁盘空间限制),MAGICK_FILE_LIMIT
(打开文件的最大数量限制),MAGICK_MEMORY_LIMIT
(堆内存限制),MAGICK_MAP_LIMIT
(内存映射限制),MAGICK_THREAD_LIMIT
(最大限制)线程限制。)和MAGICK_TIME_LIMIT
(最长经过时间(以秒为单位))。如果设置了这些环境变量,它们将优先于policy.xml配置文件。
-limit <name> <value>
命令行上的设置。<names>
可以识别以下内容:
width
(图像的最大宽度)。当超过限制时,将引发异常并停止处理。height
(图像的最大高度)。当超过限制时,将引发异常并停止处理。area
(任何单个图像驻留在像素缓存中的最大字节数)。超过限制时,将自动对磁盘(可能是内存映射)进行自动缓存。memory
(从匿名映射的内存或堆中为像素缓存分配的最大内存)。 map
(分配给像素缓存的内存映射的最大数量)。 disk
(像素缓存允许使用的最大磁盘空间量)。超过限制时,不会创建像素缓存,并且会引发致命异常。files
(打开的像素缓存文件的最大数量)。当超过限制时,将关闭所有随后缓存到磁盘的像素,并根据需要重新打开。thread
(可以并行的最大线程数)。time
(允许一个进程执行的最长时间(以秒为单位))。超过此限制后,将引发异常并停止处理。-limit
命令行上的设置优先,并覆盖所有其他设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句