在PNG-24中用于PHP Imagick颜色替换的更有效方法

时间:2011-02-09 17:56:02

标签: php imagemagick imagick

我正在创建一个小型网络应用程序,人们可以为赛车的不同部分选择颜色。我正在使用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似乎对此任务可能有点过分;我不是在做渐变贴图,我只是用纯色替换所有彩色像素。然而,无论我使用什么功能,它可能仍然需要迭代超过几百万像素。

有没有更有效的方法来实现这一目标,还是这只是我想要做的事情的性质?

1 个答案:

答案 0 :(得分:1)

AFAIK,这就是你正在做的事情的本质。当它真正归结为它时,你只是改变多维数组的一堆索引的值。在某些时候,会有一个循环。

还有colorFloodfillImage,但我从未真正使用过该方法。虽然值得一试。

我猜想clutImage比迭代像素更好,因为它以c速度运行,其中使用php构造(for / while / foreach)迭代像素可能会更慢。

您可以真正提高性能的一种方法是缓存零件,以便给定颜色为y的给定零件x仅生成一次。下次有人想要用颜色y绘制x部分时,您所要做的就是从缓存中提取渲染图像。您可以将图像存储为文件,也可以在clutImage调用之后将imagick对象存储在内存对象缓存(apc / memcached / etc.)中,这样就可以将其与其他对象合成。

第h