AS3中的反黑白单色位图数据

时间:2011-09-23 14:25:14

标签: flash actionscript-3

我想知道在AS3中是否有任何反转黑白/单色位图数据的好方法,不涉及通过逐像素设置每个像素?

4 个答案:

答案 0 :(得分:10)

查找bitmapData.colorTransform() [docs]和ColorTransform班级[docs]

您可能希望应用以下内容:

var bd:BitmapData;
var invertTransform:ColorTransform = new ColorTransform(-1,-1,-1,1,255,255,255,0)
db.colorTransform(db.rect, invertTransform)

将每个像素乘以-1然后再加上255.所以255将变为0而0将变为255.

答案 1 :(得分:8)

还有另一种解决方案。每个显示对象都具有 blendMode 属性,并且能够根据该混合模式更改背景对象的颜色。您所要做的就是用另一个显示对象覆盖位图对象并设置其混合模式。它与蒙版非常相似,但适用于颜色而不是形状。

colorCoverObject.blendMode = BlendMode.INVERT;

colorCoverObject应该是透明对象。

答案 2 :(得分:1)

对于ActionScript 2.0:

colorCoverObject.blendMode="invert"; 

彩色封面对象背后的影片剪辑显示反色。

答案 3 :(得分:0)

单色效果我刚创建了一个教程

单色效果的预览:

enter image description here

需要:

  1. 了解位图和位图数据
  2. 什么是阈值

      

    此调整采用图像中的所有像素   并......将它们推向纯白色或纯黑色

    我们必须做什么

      

    这是此示例的 Live Demo ,另外还有一些   更改,例如使用UI在运行时更改阈值级别。

         

    enter image description here

    动作脚本3中的

    阈值 <子> from as3 official documentation

      

    根据指定的阈值测试图像中的像素值并进行设置   将测试传递给新颜色值的像素。使用阈值()   方法,您可以隔离和替换图像中的颜色范围   对图像像素执行其他逻辑操作。

         

    threshold()方法的测试逻辑如下:

         
        
    1. 如果((pixelValue&amp; mask)操作(阈值和掩码)),则设置   像素到颜色;
    2.   
    3. 否则,如果copySource == true,则将像素设置为   来自sourceBitmap的相应像素值。
    4.   

    我刚评论了以下代码,其名称为引用说明。

    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Rectangle;
    import flash.geom.Point;
    
    var bmd:BitmapData = new wildcat(); // instantied a bitmapdata from library a wildcat
    var bmp:Bitmap = new Bitmap(bmd); // our display object to previewing bitmapdata on stage
    addChild(bmp);
    monochrome(bmd); // invoking threshold function
    
    /**
        @param bmd, input bitmapData that should be monochromed
    */
    function monochrome(bmd:BitmapData):void {
        var bmd_copy:BitmapData = bmd.clone(); // holding a pure copy of bitmapdata for comparation steps
        // this is our "threshold" in description above, source pixels will be compared with this value
        var level:uint = 0xFFAAAAAA; // #AARRGGBB. in this case i used RGB(170,170,170) with an alpha of 1. its not median but standard
        // A rectangle that defines the area of the source image to use as input.
        var rect:Rectangle = new Rectangle(0,0,bmd.width,bmd.height);
        // The point within the destination image (the current BitmapData instance) that corresponds to the upper-left corner of the source rectangle.
        var dest:Point = new Point();
        // thresholding will be done in two section
        // the last argument is "mask", which exists in both sides of comparation
        // first, modifying pixels which passed comparation and setting them all with "color" white (0xFFFFFFFF)
        bmd.bitmapData.threshold(bmd_copy, rect, dest, ">", level, 0xFFFFFFFF, 0xFFFFFFFF);
        // then, remaining pixels and make them all with "color" black (0xFF000000)
        bmd.bitmapData.threshold(bmd_copy, rect, dest, "<=", level, 0xFF000000, 0xFFFFFFFF);
        // Note: as we have no alpha channel in our default BitmapData (pixelValue), we left it to its full value, a white mask (0xffffffff)
    }