其实黑色和白色都是灰色。当灰色达到最亮程度时,就是白色;达到最暗的程度时就是黑色了。将彩图变成黑白图,专业的说应该是转化为灰度图像。在RGB颜色空间中,当R,G,B颜色分量的值相等时,所呈现的颜色就是灰色了(在明白RGB颜色空间的原理之后,这个不难理解)。我们通过对原图的R,G,B分量加权平均计算出具有同等亮度的灰度值来完成这个变化。下面上代码:
package imgChange
{
importflash.display.Bitmap;
importflash.display.BitmapData;
public class imgTransform
{
public static functiongreyTransform(srcBMP:Bitmap):Bitmap
{
var srcW:Number =srcBMP.width; //获得源图像的宽度
var srcH:Number =srcBMP.height; //获得源图像的高度
var destData:BitmapData=newBitmapData(srcW,srcH); //初始化待填充像素矩阵 var srcData:BitmapData =srcBMP.bitmapData; //得到源图像像素矩阵
for(varj:int=0;j<srcH;j++){ //j为目标图像的纵坐标
for(vari:int=0;i<srcW;i++){ //i为目标图像的横坐标
//将颜色分解成 r,g,b
var rgbArray:Array =pixelProcess.retrieveRGBComponent(srcData.getPixel(i,j));
//实际中由于红色和黄色看上去比蓝色亮,取平均值的话会导致红黄区域较暗,而蓝色区域较亮,因此应用颜色分量的加权和来计算等效的亮度值
var Y:Number = 0.299*rgbArray[0]+0.587*rgbArray[1]+0.114*rgbArray[2];
var colorArray:Array =new Array(Y,Y,Y);
// r,g,b合成颜色
var color:uint = pixelProcess.generateFromRGBComponent(colorArray);
//设置目标图像某点的颜色
destData.setPixel(i,j,color);
}
}
var destBMP:Bitmap =newBitmap(destData);
return destBMP;
}
}
}
package imgChange
{
importflash.display.Bitmap;
importflash.display.BitmapData;
public class pixelProcess
{
/* 输入一个颜色,将它拆成三个部分:
*红色,绿色和蓝色
*/
public static functionretrieveRGBComponent( color:uint ):Array
{
var r:Number = (color>> 16) & 0xff;
var g:Number = (color>> 8) & 0xff;
var b:Number = color& 0xff;
return [r, g, b];
}
/*
*红色,绿色和蓝色三色组合
*/
public static functiongenerateFromRGBComponent( rgb:Array ):uint
{
if( rgb ==null || rgb.length != 3||
rgb[0]< 0 || rgb[0] > 255 ||
rgb[1]< 0 || rgb[1] > 255 ||
rgb[2]< 0 || rgb[2] > 255 )
return 0xFFFFFF;
return rgb[0] << 16 |rgb[1] << 8 | rgb[2];
}
}
}
下面看下效果:
package
{
importflash.display.Sprite;
import imgChange.*;
importflash.display.Bitmap;
importflash.display.BitmapData;
public class FigureImg extends Sprite
{
public function FigureImg()
{
[Embed(source="风景.jpg")]
var LL:Class;
varlog:Bitmap = new LL()as Bitmap;
addChild(imgTransform.greyTransform(log));
}
}
}