首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PNG-24中PHP Imagick颜色替换的高效方法

PNG-24中PHP Imagick颜色替换的高效方法
EN

Stack Overflow用户
提问于 2011-02-10 01:56:02
回答 1查看 1.5K关注 0票数 0

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

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

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

示例代码:

代码语言:javascript
复制
<?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似乎有点过头了;我不是在做渐变贴图,我只是用纯色替换所有彩色像素。然而,无论我使用什么函数,它可能仍然需要迭代超过数百万像素。

有没有更有效的方法来完成这件事,或者这只是我正在尝试做的事情的本质?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-10 02:08:42

AFAIK,这就是你所做的事情的本质。实际上,您只需更改多维数组的一系列索引的值即可。在某一时刻,会有一个循环。

还有colorFloodfillImage,但我从未实际使用过该方法。不过,这可能值得一试。

我猜想clutImage比遍历像素更好,因为它是以c语言运行的,而使用php结构(for/while/foreach)遍历像素可能会更慢。

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

hth。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4948596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档