【问题标题】:More Efficient Method for PHP Imagick Color Replacement In PNG-24PNG-24 中 PHP Imagick 颜色替换的更有效方法
【发布时间】:2023-04-07 05:00:01
【问题描述】:

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

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

【问题讨论】:

    标签: php imagemagick imagick


    【解决方案1】:

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

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

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

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

    第一次。

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 2023-03-18
      • 1970-01-01
      • 2023-04-10
      • 2011-06-21
      • 2013-03-01
      • 2017-02-17
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多