我正在创建一个小型网络应用程序,人们可以为赛车的不同部分选择颜色。我正在使用ImageMagick拍摄汽车各部分的单独图像,重新着色它们(使用clutImage函数),并将它们叠加在一起以创建最终图像。
每张图片都是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似乎对此任务可能有点过分;我不是在做渐变贴图,我只是用纯色替换所有彩色像素。然而,无论我使用什么功能,它可能仍然需要迭代超过几百万像素。
有没有更有效的方法来实现这一目标,还是这只是我想要做的事情的性质?
答案 0 :(得分:1)
AFAIK,这就是你正在做的事情的本质。当它真正归结为它时,你只是改变多维数组的一堆索引的值。在某些时候,会有一个循环。
还有colorFloodfillImage,但我从未真正使用过该方法。虽然值得一试。
我猜想clutImage比迭代像素更好,因为它以c速度运行,其中使用php构造(for / while / foreach)迭代像素可能会更慢。
您可以真正提高性能的一种方法是缓存零件,以便给定颜色为y的给定零件x仅生成一次。下次有人想要用颜色y绘制x部分时,您所要做的就是从缓存中提取渲染图像。您可以将图像存储为文件,也可以在clutImage调用之后将imagick对象存储在内存对象缓存(apc / memcached / etc.)中,这样就可以将其与其他对象合成。
第h