0

我正在创建一个小型网络应用程序,人们可以在其中为赛车的不同部分选择颜色。我正在使用 ImageMagick 为汽车的每个部分拍摄单独的图像,对它们重新着色(使用 clutImage 函数),然后将它们叠加在一起以创建最终图像。

每个图像都是具有 alpha 透明度的 PNG-24。每个图像的大小完全相同,以便更容易组合它们。

大约有十层,其中六层正在重新着色。问题是性能有点差;每次颜色更改后,渲染图像大约需要十秒钟。这是我的代码:

示例代码:

<?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 似乎对这项任务来说可能是矫枉过正;我不是在做渐变图,我只是用纯色替换所有彩色像素。然而,无论我使用什么功能,它可能仍然需要迭代超过几百万像素。

有没有更有效的方法来实现这一点,或者这只是我想要做的事情的本质?

4

1 回答 1

1

AFAIK,这就是你所做的事情的本质。归根结底,您只是在更改多维数组的一堆索引的值。在某些时候,会有一个循环。

还有colorFloodfillImage,但我从来没有真正使用过那个方法。不过,这可能值得一试。

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

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

hth。

于 2011-02-09T18:08:41.877 回答