5

如何在AS3中将彩色位图的位图数据更改为黑白?我正在为 Flash 中的 CMS 开发一个简单的图像编辑器工具。

人们应该能够将上传的位图的颜色切换为黑白。我希望位图数据本身发生变化,所以之后我可以使用 Adob​​e 的 JPGEncoder 类将其写入 ByteArray。

4

7 回答 7

28

这将是我认为最优雅的解决方案(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允许许多事情,例如色调变化,着色,变亮,变暗和去饱和等等......否则BitmapData::paletteMapBitmapData::colorTransform是很好的补充......

只是想注意,使用以下

const rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6; 

看起来更自然一点,因为主观#00FF00上比 更亮#FF0000,而后者又比 更亮#0000FF

那么祝你好运吧 ... ;)

问候

back2dos

于 2009-07-08T16:08:46.603 回答
2

好吧,只需使用 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);
    }
}
于 2009-07-08T15:58:30.460 回答
2

实际上,您可以以更简单的方式使用 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 容器。谢谢 back2dos :)

于 2012-01-06T10:50:34.917 回答
1

感谢 Cookie,复制原始位图数据确实是最简单的恢复颜色的解决方案。

   function clearColor() {
      colorbmd = new BitmapData(source.width, source.height);
      colorbmd = source.clone();
      //apply filter here    
    }
    function restoreColor() {
      source = colorbmd;
    }

我认为一旦将图像转换为黑白图像,就无法返回(在转换过程中会丢失信息)。在应用过滤器之前,您必须制作副本。– CookieOfFortune

于 2009-07-09T15:30:47.943 回答
1

我使用这个狙击手:

//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]}});
于 2011-04-21T19:59:28.520 回答
0

我尝试了这两种方法。似乎 ColorMatrixFilter 方法在处理大图像时工作得更快。

有什么方法可以删除过滤器吗?还是我应该再次更改 ColorMatrixFilter 值?

于 2009-07-09T09:50:16.410 回答
0

感谢您的方法,我创建了一个小工具,可以让您使用这些值: http ://bjornson.inhb.de/?p=159

初始值是 macke 提出的值:RGB 为 30%、59% 和 11%。

您还可以加载外部图像并尝试为您的图像获得最佳效果。

于 2011-01-31T15:42:51.830 回答