2011-02-09 52 views
0

我正在創建一個小型的網絡應用程序,人們可以爲賽車的不同部分選擇顏色。我使用ImageMagick取車的各部分的單獨的圖像,它們重新着色(用clutImage功能),以及層它們彼此的頂部以產生最終的圖像。用於PHP Imagick顏色替換的更有效的方法在PNG-24中

每個圖像是PNG-24帶alpha透明度。每幅圖像的尺寸完全相同,以便於將它們組合起來。

大概有十層,其中六層正在重新着色。問題是性能有點差;大約需要十秒鐘才能在每次換色後渲染圖像。這裏是我的代碼:

示例代碼:

<?php 
    if(isSet($piece['color'])) { 
    //make a 1pixel image to replace color with 
    $clut = new Imagick(); 
    $clut->newImage(1, 1, new ImagickPixel("#".$piece["color"])); 
    //change the color of the part 
    $car_part->clutImage($clut); 
    } 
    //now we need to add the part onto the car 
    $car->compositeImage($car_part, Imagick::COMPOSITE_DEFAULT, 0, 0); 

clutImage好像它可能是矯枉過正了這個任務;我沒有做漸變映射,我只是用純色替換所有顏色的像素。然而不管我用什麼樣的功能,它可能仍然有幾百萬像素的總迭代。

有沒有更高效的方法來完成這個,或者這只是我想要做的事情的性質?

回答

1

據我所知,這是你在做什麼性質。當它真的發生的時候,你只是改變了一堆多維數組的索引值。在某個點或另一個點上,會出現一個循環。

還有colorFloodfillImage,但我從來沒有真正使用過這種方法。儘管這可能值得一試。

我猜想clutImage比遍歷像素更好,因爲它運行在c速度,其中使用php構造(for/while/foreach)遍歷像素的速度可能會更慢。

您可能能夠真正提高性能的一種方法是緩存部件,以便給定顏色y的部件x僅生成一次。下一次有人想用y色繪製x部分時,您只需從緩存中提取渲染的圖像。您可以將圖像存儲爲文件,或者在clutImage調用之後將imagick對象存儲在內存對象緩存(apc/memcached /等)中,以便將其與其他對象組合。

hth。