AS3:如何将彩色位图的BitmapData更改为黑白?

时间:2009-07-08 15:38:52

标签: flash actionscript-3 bitmapdata

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

人们应该能够将上传的位图的颜色切换为黑白。 我希望bitmapdata本身改变所以我可以用Adobe的JPGEncoder类将其写入ByteArray。

7 个答案:

答案 0 :(得分:27)

这将是我认为最优雅的解决方案(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::Pointflash.filters::ColorMaxtrixFilter ...

ColorMatrixFilter允许许多事情,例如色调偏移,色彩化,闪电,变暗和去饱和等等......否则BitmapData::paletteMapBitmapData::colorTransform是很好的补充...

只是想注意,使用以下

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

看起来更自然,因为主观上,#00FF00#FF0000更亮,而#0000FF反过来比{{1}}更亮

祝你好运......;)

格尔茨

back2dos

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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容器,其中bitmapdata作为可视元素存在。 谢谢back2dos :)

答案 3 :(得分:1)

谢谢Cookie, 复制原始的bitmapdata确实是恢复颜色最简单的解决方案。

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

我想一旦你改变了   黑白图像你不能去   回来(你在这期间失去了信息)   转换)。你必须做一个   在应用过滤器之前复制。 -   CookieOfFortune

答案 4 :(得分: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]}});

答案 5 :(得分:0)

我尝试了两种方法。 看起来像ColorMatrixFilter方法在处理大图像时工作速度要快得多。

是否有一些方法可以删除过滤器?或者我再次更改ColorMatrixFilter值?

答案 6 :(得分:0)

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

初始值是macke提出的值:rgb的30%,59%和11%。

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