2008/03/11 | actionscript 3.0 图像处理(通道篇)
类别(flash As) | 评论(3) | 阅读(3042) | 发表于 21:08
原文地址:http://hydra1983.blog.163.com/blog/static/1117503720082110425146/a

示例文件:
www.box.net/shared/iuxxkd8004

问题:

1、将图片的R,G,B通道分别分离出来,以RGB模式,灰度模式表示

2、将图片以灰度模式表示

源码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Script>
  <![CDATA[
   import mx.core.UIComponent;
   import flash.display.Bitmap;
   import flash.display.BitmapData;
   import flash.display.BitmapDataChannel;
   private var bm:Bitmap;
            private var bmd:BitmapData;
           
    private function image_complete(evt:Event):void
    {
                /* Create Bitmap from Image content. */
                bm = img.content as Bitmap;

                /* Create new BitmapData object. */
                bmd = new BitmapData(img.contentWidth, img.contentHeight);

                /* Draw Bitmap into BitmapData. */
                bmd.draw(bm.bitmapData);
               
                process(imgr,getRedChannelData(bmd));
                process(imgg,getGreenChannelData(bmd));
                process(imgb,getBlueChannelData(bmd));
               
                process(gimgr,getRedChannelGrayScaleData(bmd));
                process(gimgg,getGreenChannelGrayScaleData(bmd));
                process(gimgb,getBlueChannelGrayScaleData(bmd));
               
                process(gimg,getGrayscaleData(bmd));               
            }
  
   //用位图数据填充Image控件
   private function process(image:Image,bitmapData:BitmapData):void
   {
             image.graphics.beginBitmapFill(bitmapData);
    image.graphics.drawRect(0,0,bitmapData.width,bitmapData.height);
    image.graphics.endFill();
   }
  
            private function image_mouseMove(evt:MouseEvent):void {
                /* Get the pixel currently under the mouse cursor. */
                //var color:int = bmd.getPixel(evt.localX, evt.localY);

                /* Convert the color value from a number to Hex string. */
                //var colorStr:String = color.toString(16).toUpperCase();

                /* Set the swatch Box instance's backgroundColor style to the color under the mouse cursor. */
                //swatch.setStyle("backgroundColor", color);

                /* Make sure colorStr is at least 6 characters. */
                //colorStr = "000000" + colorStr;

                /* Make sure colorStr is at MOST 6 characters. */
                //lbl.text = "#" + colorStr.substr(colorStr.length - 6);
            }
           
            //获取红色通道中每个像素的值
            private function getRedChannelData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               data.setPixel(i,j,getRed(source.getPixel(i,j)) << 16);
              }
             }
             return data;
            }
           
            //获取红色通道灰度模式下每个像素的值
            private function getRedChannelGrayScaleData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               var red:uint = getRed(source.getPixel(i,j));
               data.setPixel(i,j,mergeRGB(red,red,red));
              }
             }
             return data;
            }
           
            private function getGreenChannelData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               data.setPixel(i,j,getGreen(source.getPixel(i,j)) << 8);
              }
             }
             return data;
            }
           
            private function getGreenChannelGrayScaleData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               var green:uint = getGreen(source.getPixel(i,j));
               data.setPixel(i,j,mergeRGB(green,green,green));
              }
             }
             return data;
            }
           
            private function getBlueChannelData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               data.setPixel(i,j,getBlue(source.getPixel(i,j)));
              }
             }
             return data;
            }
           
            private function getBlueChannelGrayScaleData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               var blue:uint = getBlue(source.getPixel(i,j));
               data.setPixel(i,j,mergeRGB(blue,blue,blue));
              }
             }
             return data;
            }
           
            //获取灰度模式下每个像素的值
            private function getGrayscaleData(source:BitmapData):BitmapData
            {
             var data:BitmapData = new BitmapData(source.width,source.height);
             for(var i:Number = 1;i<source.width;i++)
             {
              for(var j:Number =1 ;j<source.height;j++)
              {
               var pixel:uint = source.getPixel(i,j);
               var r:uint = getRed(pixel);
               var g:uint = getGreen(pixel);
               var b:uint = getBlue(pixel);
               var gray:uint = rgb2gray(r,g,b);           
               data.setPixel(i,j,mergeRGB(gray,gray,gray));
              }
             }
             return data;
            }
           
            //获取红色通道中该像素的值
            private function getRed(rgb:uint):uint
            {
             if(!isHex24(rgb))
             {
              throw new Error("rgb value is not correct!");
             }
             var mask:uint = 0xff0000;
             var red:uint = (rgb & mask) >> 16;
            
             return red;
            }
           
            //当该像素色彩值包含alpha通道的值时,获取红色通道中该像素的值
            private function getRed32(argb:uint):uint
            {
             if(!isHex32(argb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0x00ff0000;
             var red:uint = (argb & mask) >> 16;
            
             return red;
            }
           
            private function getGreen(rgb:uint):uint
            {
             if(!isHex24(rgb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0x00ff00;
             var green:uint = (rgb & mask) >> 8;
            
             return green;
            }
           
            private function getGreen32(argb:uint):uint
            {
             if(!isHex32(argb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0x0000ff00;
             var green:uint = (argb & mask) >> 8;
            
             return green;
            }
           
            private function getBlue(rgb:uint):uint
            {
             if(!isHex24(rgb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0x0000ff;
             var blue:uint = (rgb & mask);
            
             return blue;
            }
           
            private function getBlue32(argb:uint):uint
            {
             if(!isHex32(argb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0x000000ff;
             var blue:uint = (argb & mask);
            
             return blue;
            }
           
            //获取该像素的alpha值
            private function getAlpha(argb:uint):uint
            {
             if(!isHex32(argb))
             {
              throw new Error("rgb value is not correct!");
             }
            
             var mask:uint = 0xff000000;
             var alpha:uint = (argb & mask) >>> 24;
            
             return alpha;
            }
           
            private function mergeRGB(red:uint,green:uint,blue:uint):uint
            {
             return (red<<16)|(green<<8)|blue;
            }
           
            private function mergeARGB(alpha:uint,red:uint,green:uint,blue:uint):uint
            {
             return (alpha << 24)|(red<<16)|(green<<8)|blue;
            }
           
            //判断是否为32位16进制数
            private function isHex32(hex:uint):Boolean
            {
             return hex.toString(16).length == 8;
            }
            //判断是否为24位16进制数
            private function isHex24(hex:uint):Boolean
            {
             return hex.toString(16).length == 6;
            }
           
            //网上摘录的算法,用于将RGB图像转换为灰度图像,按像素转换。
            private function rgb2gray(R:Number,G:Number,B:Number):Number
            {
             var x:Number;
             var y:Number;
             var z:Number;
             var gray:Number;
            
             var r:Number = R/255.0;
             var g:Number = G/255.0;
             var b:Number = B/255.0;
            
             r = Math.pow((r+0.055)/1.055,2.4);
             g = Math.pow((g+0.055)/1.055,2.4);
             b = Math.pow((b+0.055)/1.055,2.4);
            
             y = r*0.222+g*0.717+b*0.061;
             x = y*0.964;
             z = y * 0.825;
            
             gray = 3.134 * x -1.617*y -0.490*z;
             gray = Math.pow(gray,1/2.4)*1.055-0.055;
             gray = gray*255;
            
             //gray = (1-(gray/255))*100;          
            
             return gray;
            
             //return R*0.3+G*0.59+B*0.11;
            }
  ]]>
 </mx:Script>
 <mx:Zoom id="zoom" />
 <mx:VBox id="container" height="100%" width="100%">
  <mx:Label text="origin"/>
  <mx:Image id="img" source="images/test.gif" completeEffect="{zoom}" complete="image_complete(event);" mouseMove="image_mouseMove(event)"/>
 
  <mx:Label text="channel"/> 
  <mx:HBox>
   <mx:VBox>
    <mx:Label text="red"/>
    <mx:Image id="imgr" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  
   <mx:VBox>
    <mx:Label text="green"/>
    <mx:Image id="imgg" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  
   <mx:VBox>
    <mx:Label text="blue"/>
    <mx:Image id="imgb" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  
  </mx:HBox>
   
  <mx:Label text="grayscale channel"/>
  <mx:HBox>
   <mx:VBox>
    <mx:Label text="red"/>
    <mx:Image id="gimgr" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  
   <mx:VBox>
    <mx:Label text="green"/>
    <mx:Image id="gimgg" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  
   <mx:VBox>
    <mx:Label text="blue"/>
    <mx:Image id="gimgb" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
   </mx:VBox>
  </mx:HBox>
 
  <mx:Label text="grayscale mode"/>
  <mx:Image id="gimg" width="{img.width}" height="{img.height}" mouseMove="image_mouseMove(event)"/>
 
  <mx:HBox>
   <mx:Box id="swatch" width="{lbl.height}" height="{lbl.height}"/>
   <mx:Label id="lbl" width="100"/>
  </mx:HBox>
 </mx:VBox>
</mx:Application>
14

评论Comments(3条)

林林
林林
2008/7/30 16:14:42
地板
看不懂那些蚂蚁一样的代码,请教一下怎么看?
綉花針_+
綉花針_+
2008/6/11 2:31:20
板凳
...汗不懂AS .也就是不会用FLASH啦...啊 我该怎么办?晕晕晕
Y.Boy
Y.Boy
2008/4/29 16:59:07
沙发
Good
<< 1

发表留言post

用 户Name:
密 码Password:
内 容Comment:
http://www.5d.cn/images/size_down.gif http://www.5d.cn/images/size_up.gif
验 证Verify:
日志分类
首页[193]
flash As[107]
有的没的[59]
数码照片[4]
自由世界[19]
blender[4]