我正在创建一个小的网络应用程序,人们可以为赛车的不同部分选择颜色。我正在使用ImageMagick为汽车的每个部分拍摄单独的图像,对它们进行重新着色(使用clutImage函数),然后将它们叠加在一起以创建最终的图像。
每个图像都是具有alpha透明度的PNG-24格式。每个图像的大小完全相同,以便更容易地组合它们。
大约有十层,其中六层正在重新着色。问题是性能有点差;在每次颜色更改后渲染图像大约需要10秒。下面是我的代码:
示例代码:
<?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似乎有点过头了;我不是在做渐变贴图,我只是用纯色替换所有彩色像素。然而,无论我使用什么函数,它可能仍然需要迭代超过数百万像素。
有没有更有效的方法来完成这件事,或者这只是我正在尝试做的事情的本质?
发布于 2011-02-10 02:08:42
AFAIK,这就是你所做的事情的本质。实际上,您只需更改多维数组的一系列索引的值即可。在某一时刻,会有一个循环。
还有colorFloodfillImage,但我从未实际使用过该方法。不过,这可能值得一试。
我猜想clutImage比遍历像素更好,因为它是以c语言运行的,而使用php结构(for/while/foreach)遍历像素可能会更慢。
一种能够真正提高性能的方法是缓存部件,这样具有给定颜色y的给定部件x只生成一次。下一次有人想要用颜色y绘制零件x时,你所要做的就是从缓存中拉出渲染的图像。您可以将图像存储为文件,或者将imagick对象存储在内存对象缓存(apc/memcached/等)中。就在clutImage调用之后,所以您可以将其与其他对象组合在一起。
hth。
https://stackoverflow.com/questions/4948596
复制相似问题