在Linux上使用ImageMagick命令行进行批量转换时出现残破的结果

CodeBrauer

这是我的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.phpfindas 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需要访问中间像素缓存存储器/存储,然后才能交付最终结果。

像素缓存存储的需求可以通过不同的资源来满足:

  • 堆内存
  • 匿名内存映射,
  • 基于磁盘的内存映射,
  • 直接磁盘。

ImageMagick逐步利用所有这些资源:

  • 堆内存用完后,它将像素存储在匿名映射中。
  • 匿名内存映射用完后,它将在磁盘上创建像素缓存,并尝试对其进行内存映射。
  • 内存映射内存耗尽后,它仅使用标准磁盘I / O。

磁盘存储很便宜,但也很慢:它比内存慢了三个数量级(一千倍)。通过使用内存映射到基于磁盘的缓存,可以提高一些速度(最多5倍)。

ImageMagick知道控制这些资源数量的各种方法:

  1. 内置默认值这些限制是:768个文件,3GB的图像区域,1.5GiB内存,3GiB内存映射和18.45EB的磁盘空间。

  2. policy.xml配置文件请查找您自己的policy.xml文件中的内容。用于convert -list policy首先查找此文件的位置。然后使用cat /some/path/policy.xml查看其内容。(该文件使用的XML语法不要忘记:任何封闭在<!---->是一个注释!)它也包含注释解释各种细节。的policy.xml可以定义不仅仅是可用资源的限制很多更多的事情。如果在其中定义了默认值,则policy.xml中的设置优先于内置默认值。

  3. 环境变量以下是可以限制IM资源的环境变量列表:(MAGICK_AREA_LIMIT映像区域限制),MAGICK_DISK_LIMIT(磁盘空间限制),MAGICK_FILE_LIMIT(打开文件的最大数量限制),MAGICK_MEMORY_LIMIT(堆内存限制),MAGICK_MAP_LIMIT(内存映射限制),MAGICK_THREAD_LIMIT(最大限制)线程限制。)和MAGICK_TIME_LIMIT(最长经过时间(以秒为单位))。如果设置了这些环境变量,它们将优先于policy.xml配置文件。

  4. -limit <name> <value>命令行上的设置<names>可以识别以下内容

    • width(图像的最大宽度)。当超过限制时,将引发异常并停止处理。
    • height(图像的最大高度)。当超过限制时,将引发异常并停止处理。
    • area(任何单个图像驻留在像素缓存中的最大字节数)。超过限制时,将自动对磁盘(可能是内存映射)进行自动缓存。
    • memory (从匿名映射的内存或堆中为像素缓存分配的最大内存)。
    • map (分配给像素缓存的内存映射的最大数量)。
    • disk(像素缓存允许使用的最大磁盘空间量)。超过限制时,不会创建像素缓存,并且会引发致命异常。
    • files(打开的像素缓存文件的最大数量)。当超过限制时,将关闭所有随后缓存到磁盘的像素,并根据需要重新打开。
    • thread (可以并行的最大线程数)。
    • time(允许一个进程执行的最长时间(以秒为单位))。超过此限制后,将引发异常并停止处理。

    -limit命令行上设置优先,并覆盖所有其他设置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过gcc命令行进行C编译时出现问题

来自分类Dev

使用bash命令/命令行进行Ubuntu备份

来自分类Dev

在Windows上从命令行批量转换图像

来自分类Dev

使用命令行进行内联音效

来自分类Dev

如何使用linux命令行下载批量数据?

来自分类Dev

如何使用linux命令行下载批量数据?

来自分类Dev

如何在Windows上使用ImageMagick命令行?

来自分类Dev

ImageMagick命令行转换-限制值

来自分类Dev

ImageMagick命令行转换-限制值

来自分类Dev

当我使用命令行进行屏幕录制时,为什么屏幕录制会出错?

来自分类Dev

在命令行上启动时出现nodejs问题

来自分类Dev

在命令行上运行“ dir / b / s”时如何使用结果创建新目录

来自分类Dev

在命令行上使用Visual Studio进行编译时如何包含库?

来自分类Dev

使用命令行参数时出现分段错误

来自分类Dev

使用 cro 命令行工具时出现问题

来自分类Dev

如何使用命令行进行文本转语音输出?

来自分类Dev

基本的Java程序无法使用命令行进行编译

来自分类Dev

使用MSBUILD和/或MSDEPLOY(.NET 3.5)从命令行进行部署

来自分类Dev

从命令行进行Java编译

来自分类Dev

我如何通过命令行进行此部署

来自分类Dev

从命令行进行剩余API测试

来自分类Dev

我可以与命令行进行交互工作吗?

来自分类Dev

Windows中的Python:从命令行进行编程

来自分类Dev

从命令行进行Telnet无效

来自分类Dev

通过命令行进行音乐组织?

来自分类Dev

我如何通过命令行进行此部署

来自分类Dev

通过命令行进行Cloud Foundry更改Buildpack

来自分类Dev

深度缩放图像-命令行工具?或批量转换

来自分类Dev

如何从命令行批量转换文件?

Related 相关文章

热门标签

归档