把彩色图变成黑白图

其实黑色和白色都是灰色。当灰色达到最亮程度时,就是白色;达到最暗的程度时就是黑色了。将彩图变成黑白图,专业的说应该是转化为灰度图像。在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));

        }

    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值