在运行时对Bitmap进行部分重新着色

时间:2010-12-09 09:29:44

标签: actionscript

我正在画一些车。它们是Bitmap,从库中的PNG加载。我需要能够为汽车着色 - 红色和绿色和蓝色,无论如何。但是,当您将汽车涂成绿色时,轮胎应保持黑色,并且窗户保持窗户颜色。

我知道有两种方法可以解决这个问题,其中一种方法都不会令我满意。首先,我可以为每辆车提供两个位图;一个在底部为身体颜色,一个在顶部为细节位。下面的位图获取其transform.colorTransform设置为将白色车身变成我需要的任何颜色。不太好,因为我最终在运行时屏幕上运行了两倍的Bitmap。

其次,当我为每辆车加载位图时,我可以用“car-body”颜色以编程方式搜索和替换“white”。也不是很好,因为我占用的内存量乘以我需要的许多颜色。

我想要的是在运行时说“用白色部件绘制这个位图变成另一种颜色”的方式。有这样的东西吗?如果答案是“不”,我会不会感到惊讶,但我觉得值得问。

4 个答案:

答案 0 :(得分:1)

您可能已经自己回答了这个问题。

我认为你的第一种方法只需要两个透明图像:一个是需要改变颜色的部分像素,另一个是图像的其余部分。您将逐个使用colorTransform或ColorMatrix过滤器。它可能甚至可以使像素需要在Sprite上覆盖颜色变化,并在叠加上设置平面颜色? 缺点是您需要创建一个“颜色映射”/像素集来替换需要替换颜色的每个不同项目。

对于第二种方法: 您可以使用threshold()之类的东西来隔离区域。

对于速度,您可能希望在Vector中存储需要替换的像素的索引。< int>可以与BitmapData的getVector()方法结合使用的对象。 (您将循环一次以获取需要替换的像素索引)

由于您将使用相同的图像(相同尺寸)以不同的颜色填充相同的内容,因此您将始终循环显示相同的像素。另请注意,在循环之后使用lock()循环到setPixel()和unlock()之后,您将获得一些速度。

或者您可以使用Pixel Bender并尝试一些绿屏/背景减法技术。它应该很快并且不会延迟执行其余的as3代码,因为Pixel Bender代码在它自己的线程中运行。

同时检查Lee's Pixel Bender减法技术。

虽然现在有点老了,你也可以使用@ Quasimondo article的一些知识。

HTH

答案 1 :(得分:0)

我有点困惑,你看到你的第二种方法和你想要的方法之间的区别。您可以逐个像素地检查加载的位图并读出颜色。如果它是白色,则用另一种颜色替换它。我没有看到倍增的内存消耗。

答案 2 :(得分:0)

您可能想尝试我的选择性颜色转换:http://www.quasimondo.com/archives/000614.php - 它是从2006年开始的,因此它的某些部分现在可能会被像素弯曲滤镜替换。

答案 3 :(得分:0)

为什么不单独加载各个部分,对要更改的部分执行颜色转换,然后使用结果执行BitmapData.copyPixels()? blit例程在机器代码中运行,所以快速邪恶。相比之下,在ActionScript中逐像素地执行此操作会非常缓慢。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#copyPixels()