如何将位图数据的彩色位图更改为黑白AS3? 我正在为Flash中的CMS开发一个简单的图像编辑器工具。AS3:如何将彩色位图的BitmapData更改为黑色和白色?
人们应该能够将上传的位图的颜色切换为黑色和白色。 我想要bitmapdata本身改变因此,我可以用Adobe的JPGEncoder Class将它写入ByteArray。
如何将位图数据的彩色位图更改为黑白AS3? 我正在为Flash中的CMS开发一个简单的图像编辑器工具。AS3:如何将彩色位图的BitmapData更改为黑色和白色?
人们应该能够将上传的位图的颜色切换为黑色和白色。 我想要bitmapdata本身改变因此,我可以用Adobe的JPGEncoder Class将它写入ByteArray。
这将是最完美的解决方案我猜想(与source
是你BitmapData
):
const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3;
source.applyFilter(source.bitmapData, source.bitmapData.rect, new Point(), new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0]));
与flash.geom::Point
和flash.filters::ColorMaxtrixFilter
...
ColorMatrixFilter
允许许多东西,比如色调变化,colorisation,闪电,变黑和饱和度等...否则BitmapData::paletteMap
和BitmapData::colorTransform
是很好的补充...
只是想注意,使用以下
const rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6;
看上去多了几分自然的,因为主观上,#00FF00
比#FF0000
亮,这又是亮度比#0000FF
好运气,然后...;)
格尔茨
back2dos
好了,只是用getPixel和setPixel和平均的颜色(我敢肯定,有可能是另一种方式与过滤器或东西要做到这一点):
for(int i = 0; i < bitmapData.height; i++)
{
for(int j = 0; j < bitmapData.width; j++)
{
var color:uint = bitmapData.getPixel(i, j);
var red:uint = color & 0xFF0000 >> 16;
var green:uint = color & 0x00FF00 >> 8;
var blue:uint = color & 0x0000FF >> 0;
var bwColor:uitn = red + green + blue/3;
bwColor = bwColor << 16 + bwColor << 8 + bwColor; // puts the average in each channel
bitmapData.setPixel(i, j, bwColor);
}
}
这将工作,但如果可能,尽量避免循环所有的像素过滤器会更快,因为它们是本地的。 – grapefrukt 2009-07-09 06:26:47
我尝试这两种方法。 似乎ColorMatrixFilter方法在处理大图像时运行速度更快。
是否有一些方法可以删除过滤器呢?或者我应该再次更改ColorMatrixFilter值?
谢谢Cookie, 复制原始位图数据确实是恢复颜色的最简单解决方案。
function clearColor() {
colorbmd = new BitmapData(source.width, source.height);
colorbmd = source.clone();
//apply filter here
}
function restoreColor() {
source = colorbmd;
}
我认为一旦你转换的 图像为黑白,你不能去 回来(你失去 转换过程中的信息)。在应用过滤器之前,您必须先制作 副本。 - CookieOfFortune
谢谢你的方法,我创建了一个小工具,可以让你的价值观玩: http://bjornson.inhb.de/?p=159
的初始值是由MACKE提出的:30%,59 %和11%为rgb。
您还可以加载外部图像并尝试获得最佳图像效果。
我用这个剪断:
//Tweens to black and white
TweenLite.to(DisplayObjectYouWantToTween ,1,{colorMatrixFilter:{matrix:[0.3,0.59,0.11,0, 0,0.3,0.59,0.11,0,0,0.3,0.59,0.11,0,0,0,0,0,1,0]}});
//Tween from black and white to Color
TweenLite.to(DisplayObjectYouWantToTween,1,{colorMatrixFilter:{matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]}});
实际上,你可以使用back2dos的解决方案在一个更简单的方法:
const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3;
mc.filters = [ new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0]) ];
其中MC均是MovieClip或Sprite容器,其中的BitmapData存在作为视觉元素。 谢谢back2dos :)
这是正确的解决方案,+1。 – CookieOfFortune 2009-07-08 21:42:01
我似乎记得,对于R,G和B,颜色的典型权重分别是30%,59%和11%。虽然,如你所写,权重有些主观,但它与颜色iirc的亮度值确实有关联。在这方面你的体重略有偏差,但方法是绝对正确的。 – 2010-05-04 08:05:21