2012-08-23 122 views
2

我想要一個PNG圖像轉換PHP中的下列方式轉換:調整圖像大小以exec和PHP

exec($cmd, $output, $return_code); 

其中$ CMD包含下面的代碼行:

/usr/bin/convert 'images/original/Id1741.png' -thumbnail x200 -quality '90' './cache/a3b84c5931d9619d12a9e244a310cb17_h200.png' 

在命令行調用此代碼工作得很好,但在網絡服務器上執行它給我以下錯誤消息:

Tried to execute : convert 'images/original/Id1741.png' -thumbnail x200 -quality '90' './cache/a3b84c5931d9619d12a9e244a310cb17_h200.png', return code: 1, output: Array() 

如果我刪除縮略圖選項,該命令在網絡服務器上執行得很好,但顯然它不會調整任何大小。所以這不是權限或設置我想的問題。

PHP版本是5.2.17。 ImageMagick版本是:6.6.0-4 2012-04-26

任何人有過類似的問題,可以幫助我呢?

+0

我在想:爲什麼不使用[imagecopyresampled](http://php.net/imagecopyresampled)或[imagecopyresized](http://php.net/imagecopyresized)? – Jocelyn

+0

您是否檢查過工作目錄和文件權限相同? Web服務器很可能在不同用戶標識的不同位置運行代碼。 – ceving

+0

正如我在問題中所述,我不認爲這是一個權限問題,因爲腳本運行良好,如果我刪除縮略圖選項。它只是將圖像從一個目錄複製到另一個目錄,但它可以工作。至於另外兩個功能,我沒有意識到它們,所以謝謝你提及它們。我會看看,但我的主要目標是使當前的工作。 –

回答

2

好吧,我終於搞定了。重定向錯誤輸出到文件後,我發現了以下錯誤:

libgomp: Thread creation failed: Resource temporarily unavailable 

看來,我的主機託管服務提供商1 & 1最近升級,這顯然使用了比那臺舊的內存(至少這是主控器說什麼)ImageMagick的版本。 他們建議限制由ImageMagick的創建線程數:

putenv('MAGICK_THREAD_LIMIT=1'); 

我把這個代碼放到我的init腳本,現在它工作得很好!

+0

工作就像一個魅力。用於Perl類型:$ ENV {'MAGICK_THREAD_LIMIT'} = 1; – Trendfischer

1

您正在轉換爲PNG,但您正在設置-quality 90(看起來只是模擬JPEG質量設置)。

但是,對於PNG輸出,-quality設置與JPEG的質量設置非常不同(它只是從0100的整數)。

對於PNG它是由兩個單數字組成:

  • 第一個數字(十位)是(主要)zlib壓縮水平,並且它可以從去到09
    (然而0的設置有着特殊的意義:當你使用它,你會得到霍夫曼壓縮,不zlib壓縮級別0。這往往是更好的... ...奇怪,但卻是事實。)

  • 的第二個數字是PNG數據編碼過濾器類型(它被壓縮前):

    • 0是無,
    • 1爲 「子」,
    • 2是 「向上」,
    • 3是「平均值」,
    • 4是「Paeth」,而
    • 5是「自適應」。

在實際應用中,這意味着:

  • 對於顏色的固體序列插圖一個 「無」 的過濾器(-quality 00)通常是最合適的。
  • 對於自然風景的照片,「自適應」濾波(-quality 05)通常是最好的。

也許您想根據此信息重新訪問您的-quality 90設置。

也許你已經知道它了。在這種情況下:我對'向合唱團講道'表示歉意。 :-)

+0

我沒有意識到,所以謝謝你指出這一點。我只是改變了它。該命令在Web服務器上無法正常工作的問題仍然存在! –