簡體   English   中英

使用imagemagick創建圖片太慢了。 怎么提高?

[英]creating pictures with imagemagick is too slow. how to improve?

我正在編寫一個小CMS,你可以上傳幾個圖像。 這些圖像通過imagemagick轉換為3個版本(大,中和縮略圖大小)

問題是imagemagick需要5分鍾才能創建4張圖片的3個版本(已上傳)。

這是imagemagick命令的部分:

foreach($upIMGS as $key => $filename){
    list($width, $height) = getimagesize($path.$filename);
    if ($width > $height) $size = "x96";
    else $size = "96x";

    exec(P_IMAGEMAGICK." ".$path.$filename." -resize $size -gravity center -crop 96x96+0+0 +repage ".$path."th-".$filename);
    exec(P_IMAGEMAGICK." ".$path.$filename." -resize 320x320 ".$path."hl-".$filename);
    exec(P_IMAGEMAGICK." ".$path.$filename." -resize 514x ".$path."fl-".$filename);

    unlink($path.$filename);
}

[$ upIMGS是一個包含最近上傳圖像的所有文件名的數組]

我的意思是..它確實有效,但太慢了,5分鍾后服務器給我一個錯誤。 一些文件是生成的,有些不是......

如果你能給我一個提示,那將是非常好的。

我最近遇到了同樣的問題,但我只是通過圖像一次將它們從原來的2592x1944調整為300xbestFit或bestFitx300

我使用的是PHP類imagick而不是命令行,但是在我的情況下,通過更改為-scale或scaleImage,我將時間縮短了一半。 這是我的測試代碼的片段。

while ($images = readdir($handle)) {
    // check to see if the first or second character is a '.' or '..', 
    // if so then remove from list
    if (substr($images,0,1) != '.') {
        //Check files to see if there extensions match any of the following image extensions. 
        // GLOB_BRACE looks for all glob criteria within the {braces}
        $images = glob($dir."{*.gif,*.jpg,*.png,*.jpeg}", GLOB_BRACE);
        // the glob function gives us an array of images
        $i = 0;
        foreach ($images as $image) {
            // parse the data given and remove the images/ $dir, 
            // imagemagick will not take paths, only image names.
            $i++;
            list ($dir, $image) = split('[/]', $image);
            echo $i, " ", $image, "<br />";

            $magick = new Imagick($dir."/".$image);
            $imageprops = $magick->getImageGeometry();

            if ($imageprops['width'] <= 300 && $imageprops['height'] <= 300) {
                // don't upscale
            } else {

                // 29 Images at 2592x1944 takes 11.555036068 seconds -> 
                // output size = 300 x 255
                $magick->scaleImage(300,300, true);

                // 29 Images at 2592x1944 takes 23.3927891254 seconds -> 
                // output size = 300 x 255
                //$magick->resizeImage(300,300, imagick::FILTER_LANCZOS, 0.9, true);
                $magick->writeImage("thumb_".$image);

            }
        }
    }
}

我正在2592x1944處理29張圖像,從23.3927891254秒到11.555036068秒。 我希望這有幫助。

編輯:

除了我上面所說的,我剛剛在ImageMagick v6示例 - API和腳本中遇到了以下內容,這可能會有所幫助:

  • “Shell腳本本質上很慢。它被解釋,需要多個步驟和額外的文件處理到磁盤。這當然更好,這要歸功於新的IM v6選項處理,允許您在一個命令中執行大量的圖像處理操作即便如此,你很少能在一個convert命令中做任何事情,所以你經常需要使用多個命令來實現你想要的。“

  • “當讀取大量或甚至大量圖像時,最好使用” 讀取修改器“來調整大小或裁剪它們,因為IM不會在完整圖像中讀取,因此會降低其內存需求。”

  • “如果你將ImageMagick稱為Apache模塊,它也將減少啟動時間,因為部件將被加載一次並且可以多次使用,而不是需要反復重載。這可能會在將來變得更加實用運行'守護進程'IM進程。“

此示例可能會有所幫助,因為它將主圖像加載到內存中並對其進行處理以生成其他圖像:

$cmd = " input.jpg \( -clone 0 -thumbnail x480 -write 480_wide.jpg +delete \)". 
" \( -clone 0 -thumbnail x250 -write 250_wide.jpg +delete \) ". 
" \( -clone 0 -thumbnail x100 -write 100_wide.jpg +delete \) -thumbnail 64x64! null: ";
exec("convert $cmd 64_square.jpg ");

這創建了4種不同尺寸的圖像。

等什么? 從三張上傳的圖片生成12張圖片不應該花費五分鍾。

我沒有看到你的其余代碼,但為什么你的getimagesize路徑是$ path。$ filename但是你取消鏈接P_UPLOADS。$ value? 他們有什么不同的原因嗎? 無論如何,$ value來自哪里,它在foreach()循環中沒有定義。 也許你只是有一個導致腳本掛起的錯誤。 我已經使用了ImageMagick(雖然沒有使用exec(),但是使用的是實際類)並且速度非常快。

你有沒有在foreach循環()上運行診斷程序? 就像打印出毫秒執行每個exec()命令一樣。

一個小技巧是首先創建最大的圖片,然后從這個創建后續圖片,而不是原始圖片。

然而,對於僅12張圖像來說,5分鍾似乎太多了。
你必須做一些調查。

  • 如果源相對較小(例如1024x768),調整大小需要相當長的時間嗎?
  • 是否需要直接從shell調用?

如果延遲是不可避免的,您可能希望將調整大小設施移動到專用服務器,將它們放入隊列並使用簡單的AJAX片段檢查該過程。

暫無
暫無

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

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