我想知道在AS3中是否有任何反转黑白/单色位图数据的好方法,不涉及通过逐像素设置每个像素?
答案 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)
单色效果我刚创建了一个教程
单色效果的预览:
什么是阈值
此调整采用图像中的所有像素 并......将它们推向纯白色或纯黑色
我们必须做什么
动作脚本3中的这是此示例的 Live Demo ,另外还有一些 更改,例如使用UI在运行时更改阈值级别。
阈值 <子> from as3 official documentation 子>
根据指定的阈值测试图像中的像素值并进行设置 将测试传递给新颜色值的像素。使用阈值() 方法,您可以隔离和替换图像中的颜色范围 对图像像素执行其他逻辑操作。
threshold()方法的测试逻辑如下:
- 如果((pixelValue&amp; mask)操作(阈值和掩码)),则设置 像素到颜色;
- 否则,如果copySource == true,则将像素设置为 来自sourceBitmap的相应像素值。
醇>
我刚评论了以下代码,其名称为引用说明。
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)
}