簡體   English   中英

在Linux上使用ImageMagick命令行批量轉換結果失敗

[英]Broken results on batch convert with ImageMagick command line on Linux

這是我的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語篇服務器中進行搜索,詢問,並在具有不同分布的2台計算機上運行此過程(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。

磁盤存儲很便宜,但也很慢:它比內存慢3個數量級(一千倍)。 通過使用內存映射到基於磁盤的緩存,可以提高一些速度(最多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設置優先,並覆蓋所有其他設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM