※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FAVORITE BY
:
Awesome Fractal
:
:
:
:
mosaique
:
BitmapDatacolorフラクタルで画像を描画
:
:
:
:
:
:
:
:
:
:
getPixelfractale
:
:
:
:
:
fractalんもう好き好き
:
:
:
:
fractalcool
:
:
:
GOOD!
:
クイズみたい
:
フラクタル
:
ふらくたる
:
fractalmariroom
:
Good..
:
:
:
FORKED
  1. // forked from fumix's フラクタルで画像を描画する
  2. /**
  3. フラクタルで画像を描画
  4. パクリ元ネタ:
  5. fladdict » コンピューターに絵画を描かせる
  6. http://fladdict.net/blog/2009/05/computer-painting.html
  7. 標準偏差:
  8. http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm
  9. 画像の読み込み処理:
  10. http://wonderfl.kayac.com/code/3fb2258386320fe6d2b0fe17d6861e7da700706a
  11. RGB->HSB変換:
  12. http://d.hatena.ne.jp/flashrod/20060930#1159622027
  13. **/
  14. package 
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Loader;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.net.URLRequest;
  23.     import flash.system.LoaderContext;
  24.     import flash.text.TextField;
  25.     /**
  26.      * ...
  27.      * @author DefaultUser (Tools -> Custom Arguments...)
  28.      */
  29.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "#ffffff")]
  30.     
  31.     public class Main extends Sprite 
  32.     {
  33.         
  34.         private const IMAGE_URL:String = "http://farm4.static.flickr.com/3639/3538831894_cca4aabd68.jpg";
  35.         //標準偏差の閾値。小さくすると細かくなるけど、小さすぎるとただのモザイクみたくなる。
  36.         private const THRESHOLD:Number = 0.1;
  37.         private var fillRectangleArray:Array;
  38.         private var image:Bitmap;
  39.         private var imageData:BitmapData;
  40.         private var _canvas:Sprite;
  41.         public function Main():void 
  42.         {
  43.             if (stage) init();
  44.             else addEventListener(Event.ADDED_TO_STAGE, init);
  45.         }
  46.         
  47.         private function init(e:Event = null):void 
  48.         {
  49.             removeEventListener(Event.ADDED_TO_STAGE, init);
  50.             //画像の読み込み
  51.                         var req:URLRequest = new URLRequest(IMAGE_URL);
  52.                         var loader:Loader = new Loader();
  53.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  54.                         loader.load( req, new LoaderContext(true));
  55.                         // take a capture after 10 sec
  56.                         Wonderfl.capture_delay( 120 );
  57.         }
  58.         
  59.         //画像読み込み後の処理
  60.         function loadComplete(e:Event = null):void 
  61.         {
  62.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  63.             
  64.             image = e.target.loader.content as Bitmap;
  65.             imageData = image.bitmapData;
  66.             //キャンバス用スプライト
  67.             _canvas = new Sprite;
  68.             
  69.             var p:RectanglePiece = new RectanglePiece();
  70.             p.x0 = 0;
  71.             p.y0 = 0;
  72.             p.x1 = imageData.width;
  73.             p.y1 = imageData.height;
  74.             p.c = 0;
  75.             //フラクタルデータ保持用配列に初期値挿入
  76.             fillRectangleArray = new Array(p);
  77.             
  78.             addChild(_canvas);
  79.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  80.         }
  81.         
  82.         //ループ
  83.         private function onEnterFrame(e:Event):void 
  84.         {
  85.             //フラクタル処理終了
  86.             if (fillRectangleArray.length < 1) {
  87.                 removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  88.                 var tx:TextField = new TextField();
  89.                 tx.text = '終了';
  90.                 tx.textColor = 0xFFFFFF;
  91.                 addChild(tx);
  92.             }else {
  93.                 //フラクタルデータ保持用配列から1つ取り出す
  94.                 var rect:RectanglePiece = fillRectangleArray.shift();
  95.                 var cArray:Array = deviationLogic(rect.x0, rect.y0, rect.x1, rect.y1);
  96.                 rect.c = cArray[0];
  97.                 var halfWidth:Number = (rect.x1 - rect.x0) / 2;
  98.                 var halfHeight:Number = (rect.y1 - rect.y0) / 2;
  99.                 // 指定した矩形内の輝度の標準偏差値が閾値以上なら2分木して処理続行
  100.                 if (rect.c > THRESHOLD && (halfWidth > 2 || halfHeight > 2)) {
  101.                     //矩形を書くよ
  102.                     _canvas.graphics.lineStyle(0, 0xAAAAAA);
  103.                     _canvas.graphics.beginFill(cArray[1]);
  104.                     _canvas.graphics.drawRect(rect.x0, rect.y0, (rect.x1 - rect.x0), (rect.y1 - rect.y0));
  105.                     
  106.                     //矩形を2分割してフラクタルデータ保持用配列に突っ込む
  107.                     var rect0:RectanglePiece = new RectanglePiece();
  108.                     var rect1:RectanglePiece = new RectanglePiece();
  109.                     if (halfWidth > halfHeight) {
  110.                         rect0.x0 = rect.x0;
  111.                         rect0.y0 = rect.y0;
  112.                         rect0.x1 = rect.x0+halfWidth;
  113.                         rect0.y1 = rect.y1;
  114.                         fillRectangleArray.push(rect0);
  115.                         rect1.x0 = rect.x0+halfWidth;
  116.                         rect1.y0 = rect.y0;
  117.                         rect1.x1 = rect.x1;
  118.                         rect1.y1 = rect.y1;
  119.                         fillRectangleArray.push(rect1);
  120.                     }else {
  121.                         rect0.x0 = rect.x0;
  122.                         rect0.y0 = rect.y0;
  123.                         rect0.x1 = rect.x1;
  124.                         rect0.y1 = rect.y0+halfHeight;
  125.                         fillRectangleArray.push(rect0);
  126.                         rect1.x0 = rect.x0;
  127.                         rect1.y0 = rect.y0+halfHeight;
  128.                         rect1.x1 = rect.x1;
  129.                         rect1.y1 = rect.y1;
  130.                         fillRectangleArray.push(rect1);
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         /**
  136.          * 指定した矩形間の輝度の標準偏差を求める
  137.          * @param    x0    左上のx座標
  138.          * @param    y0    左上のy座標
  139.          * @param    x1    右下のx座標
  140.          * @param    y1    右下のy座標
  141.          * @return    標準偏差値とカラーの平均
  142.          */
  143.         private function deviationLogic(x0:Number,y0:Number,x1:Number,y1:Number):Array {
  144.             var rgb:uint = 0;
  145.             var r:uint = 0;
  146.             var g:uint = 0;
  147.             var b:uint = 0;
  148.             var hsb:Array = new Array();
  149.             var bArray:Array = new Array();
  150.             var br:Number = 0;
  151.             var av:Number = 0;
  152.             //輝度の平均を計算
  153.             for (var i:int = x0; i < x1;i++ ) {
  154.                 for (var j:int = y0; j < y1; j++ ) {
  155.                     rgb = imageData.getPixel(i, j);
  156.                     r += (rgb >> 16) & 255;
  157.                     g += (rgb >> 8) & 255;
  158.                     b += rgb & 255;
  159.                     hsb = uintRGBtoHSB(rgb);
  160.                     br += hsb[2];
  161.                     bArray.push(hsb[2]);
  162.                 }
  163.             }
  164.             av = br / bArray.length;
  165.             r = r / bArray.length;
  166.             g = g / bArray.length;
  167.             b = b / bArray.length;
  168.             rgb = (r << 16) | (g << 8) | (b << 0);
  169.             //標準偏差を計算
  170.             br = 0;
  171.             for (i = 0; i < bArray.length; i++ ) {
  172.                 br += (bArray[i] - av) *(bArray[i] - av);
  173.             }
  174.             return [Math.sqrt(br / bArray.length),rgb];
  175.             
  176.         }
  177.         /**
  178.          * 
  179.          * @param    rgb    RGB成分(uint)
  180.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  181.          */
  182.         private function uintRGBtoHSB(rgb:uint):Array {
  183.             var r:uint = (rgb >> 16) & 255;
  184.             var g:uint = (rgb >> 8) & 255;
  185.             var b:uint = rgb & 255;
  186.             return RGBtoHSB(r, g, b);
  187.         }
  188.         /** RGBからHSBをつくる
  189.          * @param r    色の赤色成分(0~255)
  190.          * @param g 色の緑色成分(0~255)
  191.          * @param b 色の青色成分(0~255)
  192.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  193.          */
  194.         private function RGBtoHSB(r:int, g:int, b:int):Array {
  195.             var cmax:Number = Math.max(r, g, b);
  196.             var cmin:Number = Math.min(r, g, b);
  197.             var brightness:Number = cmax / 255.0;
  198.             var hue:Number = 0;
  199.             var saturation:Number = (cmax != 0) ? (cmax - cmin) / cmax : 0;
  200.             if (saturation != 0) {
  201.                 var redc:Number = (cmax - r) / (cmax - cmin);
  202.                 var greenc:Number = (cmax - g) / (cmax - cmin);
  203.                 var bluec:Number = (cmax - b) / (cmax - cmin);
  204.                 if (r == cmax) {
  205.                     hue = bluec - greenc;
  206.                 } else if (g == cmax) {
  207.                     hue = 2.0 + redc - bluec;
  208.                 } else {
  209.                     hue = 4.0 + greenc - redc;
  210.                 }
  211.                 hue = hue / 6.0;
  212.                 if (hue < 0) {
  213.                     hue = hue + 1.0;
  214.                 }
  215.             }
  216.             return [hue, saturation, brightness];
  217.         }
  218.     }    
  219. }
  220.     /**
  221.      * ...
  222.      * @author DefaultUser (Tools -> Custom Arguments...)
  223.      */
  224.     class RectanglePiece 
  225.     {
  226.         public var x0:Number;
  227.         public var y0:Number;
  228.         public var x1:Number;
  229.         public var y1:Number;
  230.         public var c:Number;
  231.         public function RectanglePiece() 
  232.         {
  233.              this.x0 = 0;
  234.              this.y0 = 0;
  235.              this.x1 = 0;
  236.              this.x1 = 0;
  237.              this.c = 0;            
  238.         }
  239.         
  240.     }
noswf
  1. // forked from fumix's フラクタルで画像を描画する
  2. /**
  3. フラクタルで画像を描画
  4. パクリ元ネタ:
  5. fladdict » コンピューターに絵画を描かせる
  6. http://fladdict.net/blog/2009/05/computer-painting.html
  7. 標準偏差:
  8. http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm
  9. 画像の読み込み処理:
  10. http://wonderfl.kayac.com/code/3fb2258386320fe6d2b0fe17d6861e7da700706a
  11. RGB->HSB変換:
  12. http://d.hatena.ne.jp/flashrod/20060930#1159622027
  13. **/
  14. package 
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Loader;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.net.URLRequest;
  23.     import flash.system.LoaderContext;
  24.     import flash.text.TextField;
  25.     /**
  26.      * ...
  27.      * @author DefaultUser (Tools -> Custom Arguments...)
  28.      */
  29.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "#ffffff")]
  30.     
  31.     public class Main extends Sprite 
  32.     {
  33.         
  34.         private const IMAGE_URL:String = "http://farm4.static.flickr.com/3639/3538831894_cca4aabd68.jpg";
  35.         //標準偏差の閾値。小さくすると細かくなるけど、小さすぎるとただのモザイクみたくなる。
  36.         private const THRESHOLD:Number = 0.1;
  37.         private var fillRectangleArray:Array;
  38.         private var image:Bitmap;
  39.         private var imageData:BitmapData;
  40.         private var _canvas:Sprite;
  41.         public function Main():void 
  42.         {
  43.             if (stage) init();
  44.             else addEventListener(Event.ADDED_TO_STAGE, init);
  45.         }
  46.         
  47.         private function init(e:Event = null):void 
  48.         {
  49.             removeEventListener(Event.ADDED_TO_STAGE, init);
  50.             //画像の読み込み
  51.                         var req:URLRequest = new URLRequest(IMAGE_URL);
  52.                         var loader:Loader = new Loader();
  53.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  54.                         loader.load( req, new LoaderContext(true));
  55.                         // take a capture after 10 sec
  56.                         Wonderfl.capture_delay( 120 );
  57.         }
  58.         
  59.         //画像読み込み後の処理
  60.         function loadComplete(e:Event = null):void 
  61.         {
  62.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  63.             
  64.             image = e.target.loader.content as Bitmap;
  65.             imageData = image.bitmapData;
  66.             //キャンバス用スプライト
  67.             _canvas = new Sprite;
  68.             
  69.             var p:RectanglePiece = new RectanglePiece();
  70.             p.x0 = 0;
  71.             p.y0 = 0;
  72.             p.x1 = imageData.width;
  73.             p.y1 = imageData.height;
  74.             p.c = 0;
  75.             //フラクタルデータ保持用配列に初期値挿入
  76.             fillRectangleArray = new Array(p);
  77.             
  78.             addChild(_canvas);
  79.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  80.         }
  81.         
  82.         //ループ
  83.         private function onEnterFrame(e:Event):void 
  84.         {
  85.             //フラクタル処理終了
  86.             if (fillRectangleArray.length < 1) {
  87.                 removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  88.                 var tx:TextField = new TextField();
  89.                 tx.text = '終了';
  90.                 tx.textColor = 0xFFFFFF;
  91.                 addChild(tx);
  92.             }else {
  93.                 //フラクタルデータ保持用配列から1つ取り出す
  94.                 var rect:RectanglePiece = fillRectangleArray.shift();
  95.                 var cArray:Array = deviationLogic(rect.x0, rect.y0, rect.x1, rect.y1);
  96.                 rect.c = cArray[0];
  97.                 var halfWidth:Number = (rect.x1 - rect.x0) / 2;
  98.                 var halfHeight:Number = (rect.y1 - rect.y0) / 2;
  99.                 // 指定した矩形内の輝度の標準偏差値が閾値以上なら2分木して処理続行
  100.                 if (rect.c > THRESHOLD && (halfWidth > 2 || halfHeight > 2)) {
  101.                     //矩形を書くよ
  102.                     _canvas.graphics.lineStyle(0, 0xAAAAAA);
  103.                     _canvas.graphics.beginFill(cArray[1]);
  104.                     _canvas.graphics.drawRect(rect.x0, rect.y0, (rect.x1 - rect.x0), (rect.y1 - rect.y0));
  105.                     
  106.                     //矩形を2分割してフラクタルデータ保持用配列に突っ込む
  107.                     var rect0:RectanglePiece = new RectanglePiece();
  108.                     var rect1:RectanglePiece = new RectanglePiece();
  109.                     if (halfWidth > halfHeight) {
  110.                         rect0.x0 = rect.x0;
  111.                         rect0.y0 = rect.y0;
  112.                         rect0.x1 = rect.x0+halfWidth;
  113.                         rect0.y1 = rect.y1;
  114.                         fillRectangleArray.push(rect0);
  115.                         rect1.x0 = rect.x0+halfWidth;
  116.                         rect1.y0 = rect.y0;
  117.                         rect1.x1 = rect.x1;
  118.                         rect1.y1 = rect.y1;
  119.                         fillRectangleArray.push(rect1);
  120.                     }else {
  121.                         rect0.x0 = rect.x0;
  122.                         rect0.y0 = rect.y0;
  123.                         rect0.x1 = rect.x1;
  124.                         rect0.y1 = rect.y0+halfHeight;
  125.                         fillRectangleArray.push(rect0);
  126.                         rect1.x0 = rect.x0;
  127.                         rect1.y0 = rect.y0+halfHeight;
  128.                         rect1.x1 = rect.x1;
  129.                         rect1.y1 = rect.y1;
  130.                         fillRectangleArray.push(rect1);
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         /**
  136.          * 指定した矩形間の輝度の標準偏差を求める
  137.          * @param    x0    左上のx座標
  138.          * @param    y0    左上のy座標
  139.          * @param    x1    右下のx座標
  140.          * @param    y1    右下のy座標
  141.          * @return    標準偏差値とカラーの平均
  142.          */
  143.         private function deviationLogic(x0:Number,y0:Number,x1:Number,y1:Number):Array {
  144.             var rgb:uint = 0;
  145.             var r:uint = 0;
  146.             var g:uint = 0;
  147.             var b:uint = 0;
  148.             var hsb:Array = new Array();
  149.             var bArray:Array = new Array();
  150.             var br:Number = 0;
  151.             var av:Number = 0;
  152.             //輝度の平均を計算
  153.             for (var i:int = x0; i < x1;i++ ) {
  154.                 for (var j:int = y0; j < y1; j++ ) {
  155.                     rgb = imageData.getPixel(i, j);
  156.                     r += (rgb >> 16) & 255;
  157.                     g += (rgb >> 8) & 255;
  158.                     b += rgb & 255;
  159.                     hsb = uintRGBtoHSB(rgb);
  160.                     br += hsb[2];
  161.                     bArray.push(hsb[2]);
  162.                 }
  163.             }
  164.             av = br / bArray.length;
  165.             r = r / bArray.length;
  166.             g = g / bArray.length;
  167.             b = b / bArray.length;
  168.             rgb = (r << 16) | (g << 8) | (b << 0);
  169.             //標準偏差を計算
  170.             br = 0;
  171.             for (i = 0; i < bArray.length; i++ ) {
  172.                 br += (bArray[i] - av) *(bArray[i] - av);
  173.             }
  174.             return [Math.sqrt(br / bArray.length),rgb];
  175.             
  176.         }
  177.         /**
  178.          * 
  179.          * @param    rgb    RGB成分(uint)
  180.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  181.          */
  182.         private function uintRGBtoHSB(rgb:uint):Array {
  183.             var r:uint = (rgb >> 16) & 255;
  184.             var g:uint = (rgb >> 8) & 255;
  185.             var b:uint = rgb & 255;
  186.             return RGBtoHSB(r, g, b);
  187.         }
  188.         /** RGBからHSBをつくる
  189.          * @param r    色の赤色成分(0~255)
  190.          * @param g 色の緑色成分(0~255)
  191.          * @param b 色の青色成分(0~255)
  192.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  193.          */
  194.         private function RGBtoHSB(r:int, g:int, b:int):Array {
  195.             var cmax:Number = Math.max(r, g, b);
  196.             var cmin:Number = Math.min(r, g, b);
  197.             var brightness:Number = cmax / 255.0;
  198.             var hue:Number = 0;
  199.             var saturation:Number = (cmax != 0) ? (cmax - cmin) / cmax : 0;
  200.             if (saturation != 0) {
  201.                 var redc:Number = (cmax - r) / (cmax - cmin);
  202.                 var greenc:Number = (cmax - g) / (cmax - cmin);
  203.                 var bluec:Number = (cmax - b) / (cmax - cmin);
  204.                 if (r == cmax) {
  205.                     hue = bluec - greenc;
  206.                 } else if (g == cmax) {
  207.                     hue = 2.0 + redc - bluec;
  208.                 } else {
  209.                     hue = 4.0 + greenc - redc;
  210.                 }
  211.                 hue = hue / 6.0;
  212.                 if (hue < 0) {
  213.                     hue = hue + 1.0;
  214.                 }
  215.             }
  216.             return [hue, saturation, brightness];
  217.         }
  218.     }    
  219. }
  220.     /**
  221.      * ...
  222.      * @author DefaultUser (Tools -> Custom Arguments...)
  223.      */
  224.     class RectanglePiece 
  225.     {
  226.         public var x0:Number;
  227.         public var y0:Number;
  228.         public var x1:Number;
  229.         public var y1:Number;
  230.         public var c:Number;
  231.         public function RectanglePiece() 
  232.         {
  233.              this.x0 = 0;
  234.              this.y0 = 0;
  235.              this.x1 = 0;
  236.              this.x1 = 0;
  237.              this.c = 0;            
  238.         }
  239.         
  240.     }
noswf
  1. // forked from fumix's フラクタルで画像を描画する
  2. /**
  3. フラクタルで画像を描画
  4. パクリ元ネタ:
  5. fladdict » コンピューターに絵画を描かせる
  6. http://fladdict.net/blog/2009/05/computer-painting.html
  7. 標準偏差:
  8. http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm
  9. 画像の読み込み処理:
  10. http://wonderfl.kayac.com/code/3fb2258386320fe6d2b0fe17d6861e7da700706a
  11. RGB->HSB変換:
  12. http://d.hatena.ne.jp/flashrod/20060930#1159622027
  13. **/
  14. package 
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Loader;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.net.URLRequest;
  23.     import flash.system.LoaderContext;
  24.     import flash.text.TextField;
  25.         import flash.utils.setInterval;
  26.         import flash.utils.clearInterval;
  27.     /**
  28.      * ...
  29.      * @author DefaultUser (Tools -> Custom Arguments...)
  30.      */
  31.     [SWF(width = "465", height = "465", frameRate = "120", backgroundColor = "#ffffff")]
  32.     
  33.     public class Main extends Sprite 
  34.     {
  35.         
  36.         private const IMAGE_URL:String = "http://farm4.static.flickr.com/3639/3538831894_cca4aabd68.jpg";
  37.         //標準偏差の閾値。小さくすると細かくなるけど、小さすぎるとただのモザイクみたくなる。
  38.         private const THRESHOLD:Number = 0.1;
  39.         private var fillRectangleArray:Array;
  40.         private var image:Bitmap;
  41.         private var imageData:BitmapData;
  42.         private var _canvas:Sprite;
  43.                 private var _interval:Number;
  44.         public function Main():void 
  45.         {
  46.             if (stage) init();
  47.             else addEventListener(Event.ADDED_TO_STAGE, init);
  48.         }
  49.         
  50.         private function init(e:Event = null):void 
  51.         {
  52.             removeEventListener(Event.ADDED_TO_STAGE, init);
  53.             //画像の読み込み
  54.                         var req:URLRequest = new URLRequest(IMAGE_URL);
  55.                         var loader:Loader = new Loader();
  56.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  57.                         loader.load( req, new LoaderContext(true));
  58.                         // take a capture after 10 sec
  59.                         Wonderfl.capture_delay( 120 );
  60.         }
  61.         
  62.         //画像読み込み後の処理
  63.         function loadComplete(e:Event = null):void 
  64.         {
  65.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  66.             
  67.             image = e.target.loader.content as Bitmap;
  68.             imageData = image.bitmapData;
  69.             //キャンバス用スプライト
  70.             _canvas = new Sprite;
  71.             
  72.             var p:RectanglePiece = new RectanglePiece();
  73.             p.x0 = 0;
  74.             p.y0 = 0;
  75.             p.x1 = imageData.width;
  76.             p.y1 = imageData.height;
  77.             p.c = 0;
  78.             //フラクタルデータ保持用配列に初期値挿入
  79.             fillRectangleArray = new Array(p);
  80.             
  81.             addChild(_canvas);
  82.                         _interval = setInterval(onEnterFrame, 5);
  83.             //addEventListener(Event.ENTER_FRAME, onEnterFrame);
  84.         }
  85.         
  86.         //ループ
  87.         private function onEnterFrame(e:Event=null):void 
  88.         {
  89.             //フラクタル処理終了
  90.             if (fillRectangleArray.length < 1) {
  91.                 //removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  92.                                 clearInterval(_interval);
  93.                 var tx:TextField = new TextField();
  94.                 tx.text = '終了';
  95.                 tx.textColor = 0xFFFFFF;
  96.                 addChild(tx);
  97.             }else {
  98.                 //フラクタルデータ保持用配列から1つ取り出す
  99.                 var rect:RectanglePiece = fillRectangleArray.shift();
  100.                 var cArray:Array = deviationLogic(rect.x0, rect.y0, rect.x1, rect.y1);
  101.                 rect.c = cArray[0];
  102.                 var halfWidth:Number = (rect.x1 - rect.x0) / 2;
  103.                 var halfHeight:Number = (rect.y1 - rect.y0) / 2;
  104.                 // 指定した矩形内の輝度の標準偏差値が閾値以上なら2分木して処理続行
  105.                 if (rect.c > THRESHOLD && (halfWidth > 2 || halfHeight > 2)) {
  106.                     //矩形を書くよ
  107.                     //_canvas.graphics.lineStyle(0, 0xAAAAAA);
  108.                     _canvas.graphics.beginFill(cArray[1]);
  109.                     _canvas.graphics.drawRect(rect.x0, rect.y0, (rect.x1 - rect.x0), (rect.y1 - rect.y0));
  110.                     
  111.                     //矩形を2分割してフラクタルデータ保持用配列に突っ込む
  112.                     var rect0:RectanglePiece = new RectanglePiece();
  113.                     var rect1:RectanglePiece = new RectanglePiece();
  114.                     if (halfWidth > halfHeight) {
  115.                         rect0.x0 = rect.x0;
  116.                         rect0.y0 = rect.y0;
  117.                         rect0.x1 = rect.x0+halfWidth;
  118.                         rect0.y1 = rect.y1;
  119.                         fillRectangleArray.push(rect0);
  120.                         rect1.x0 = rect.x0+halfWidth;
  121.                         rect1.y0 = rect.y0;
  122.                         rect1.x1 = rect.x1;
  123.                         rect1.y1 = rect.y1;
  124.                         fillRectangleArray.push(rect1);
  125.                     }else {
  126.                         rect0.x0 = rect.x0;
  127.                         rect0.y0 = rect.y0;
  128.                         rect0.x1 = rect.x1;
  129.                         rect0.y1 = rect.y0+halfHeight;
  130.                         fillRectangleArray.push(rect0);
  131.                         rect1.x0 = rect.x0;
  132.                         rect1.y0 = rect.y0+halfHeight;
  133.                         rect1.x1 = rect.x1;
  134.                         rect1.y1 = rect.y1;
  135.                         fillRectangleArray.push(rect1);
  136.                     }
  137.                 }
  138.             }
  139.         }
  140.         /**
  141.          * 指定した矩形間の輝度の標準偏差を求める
  142.          * @param    x0    左上のx座標
  143.          * @param    y0    左上のy座標
  144.          * @param    x1    右下のx座標
  145.          * @param    y1    右下のy座標
  146.          * @return    標準偏差値とカラーの平均
  147.          */
  148.         private function deviationLogic(x0:Number,y0:Number,x1:Number,y1:Number):Array {
  149.             var rgb:uint = 0;
  150.             var r:uint = 0;
  151.             var g:uint = 0;
  152.             var b:uint = 0;
  153.             var hsb:Array = new Array();
  154.             var bArray:Array = new Array();
  155.             var br:Number = 0;
  156.             var av:Number = 0;
  157.             //輝度の平均を計算
  158.             for (var i:int = x0; i < x1;i++ ) {
  159.                 for (var j:int = y0; j < y1; j++ ) {
  160.                     rgb = imageData.getPixel(i, j);
  161.                     r += (rgb >> 16) & 255;
  162.                     g += (rgb >> 8) & 255;
  163.                     b += rgb & 255;
  164.                     hsb = uintRGBtoHSB(rgb);
  165.                     br += hsb[2];
  166.                     bArray.push(hsb[2]);
  167.                 }
  168.             }
  169.             av = br / bArray.length;
  170.             r = r / bArray.length;
  171.             g = g / bArray.length;
  172.             b = b / bArray.length;
  173.             rgb = (r << 16) | (g << 8) | (b << 0);
  174.             //標準偏差を計算
  175.             br = 0;
  176.             for (i = 0; i < bArray.length; i++ ) {
  177.                 br += (bArray[i] - av) *(bArray[i] - av);
  178.             }
  179.             return [Math.sqrt(br / bArray.length),rgb];
  180.             
  181.         }
  182.         /**
  183.          * 
  184.          * @param    rgb    RGB成分(uint)
  185.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  186.          */
  187.         private function uintRGBtoHSB(rgb:uint):Array {
  188.             var r:uint = (rgb >> 16) & 255;
  189.             var g:uint = (rgb >> 8) & 255;
  190.             var b:uint = rgb & 255;
  191.             return RGBtoHSB(r, g, b);
  192.         }
  193.         /** RGBからHSBをつくる
  194.          * @param r    色の赤色成分(0~255)
  195.          * @param g 色の緑色成分(0~255)
  196.          * @param b 色の青色成分(0~255)
  197.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  198.          */
  199.         private function RGBtoHSB(r:int, g:int, b:int):Array {
  200.             var cmax:Number = Math.max(r, g, b);
  201.             var cmin:Number = Math.min(r, g, b);
  202.             var brightness:Number = cmax / 255.0;
  203.             var hue:Number = 0;
  204.             var saturation:Number = (cmax != 0) ? (cmax - cmin) / cmax : 0;
  205.             if (saturation != 0) {
  206.                 var redc:Number = (cmax - r) / (cmax - cmin);
  207.                 var greenc:Number = (cmax - g) / (cmax - cmin);
  208.                 var bluec:Number = (cmax - b) / (cmax - cmin);
  209.                 if (r == cmax) {
  210.                     hue = bluec - greenc;
  211.                 } else if (g == cmax) {
  212.                     hue = 2.0 + redc - bluec;
  213.                 } else {
  214.                     hue = 4.0 + greenc - redc;
  215.                 }
  216.                 hue = hue / 6.0;
  217.                 if (hue < 0) {
  218.                     hue = hue + 1.0;
  219.                 }
  220.             }
  221.             return [hue, saturation, brightness];
  222.         }
  223.     }    
  224. }
  225.     /**
  226.      * ...
  227.      * @author DefaultUser (Tools -> Custom Arguments...)
  228.      */
  229.     class RectanglePiece 
  230.     {
  231.         public var x0:Number;
  232.         public var y0:Number;
  233.         public var x1:Number;
  234.         public var y1:Number;
  235.         public var c:Number;
  236.         public function RectanglePiece() 
  237.         {
  238.              this.x0 = 0;
  239.              this.y0 = 0;
  240.              this.x1 = 0;
  241.              this.x1 = 0;
  242.              this.c = 0;            
  243.         }
  244.         
  245.     }
noswf
  1. // forked from fumix's フラクタルで画像を描画する
  2. /**
  3. フラクタルで画像を描画
  4. パクリ元ネタ:
  5. fladdict » コンピューターに絵画を描かせる
  6. http://fladdict.net/blog/2009/05/computer-painting.html
  7. 標準偏差:
  8. http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm
  9. 画像の読み込み処理:
  10. http://wonderfl.kayac.com/code/3fb2258386320fe6d2b0fe17d6861e7da700706a
  11. RGB->HSB変換:
  12. http://d.hatena.ne.jp/flashrod/20060930#1159622027
  13. **/
  14. package 
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Loader;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.net.URLRequest;
  23.     import flash.system.LoaderContext;
  24.     import flash.text.TextField;
  25.     /**
  26.      * ...
  27.      * @author DefaultUser (Tools -> Custom Arguments...)
  28.      */
  29.     [SWF(width = "465", height = "465", frameRate = "80", backgroundColor = "#ffffff")]
  30.     
  31.     public class Main extends Sprite 
  32.     {
  33.         
  34.         private const IMAGE_URL:String = "http://farm4.static.flickr.com/3639/3538831894_cca4aabd68.jpg";
  35.         //標準偏差の閾値。小さくすると細かくなるけど、小さすぎるとただのモザイクみたくなる。
  36.         private const THRESHOLD:Number = 0.1;
  37.         private var fillRectangleArray:Array;
  38.         private var image:Bitmap;
  39.         private var imageData:BitmapData;
  40.         private var _canvas:Sprite;
  41.         public function Main():void 
  42.         {
  43.             if (stage) init();
  44.             else addEventListener(Event.ADDED_TO_STAGE, init);
  45.         }
  46.         
  47.         private function init(e:Event = null):void 
  48.         {
  49.             removeEventListener(Event.ADDED_TO_STAGE, init);
  50.             //画像の読み込み
  51.                         var req:URLRequest = new URLRequest(IMAGE_URL);
  52.                         var loader:Loader = new Loader();
  53.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  54.                         loader.load( req, new LoaderContext(true));
  55.                         // take a capture after 10 sec
  56.                         Wonderfl.capture_delay( 120 );
  57.         }
  58.         
  59.         //画像読み込み後の処理
  60.         function loadComplete(e:Event = null):void 
  61.         {
  62.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  63.             
  64.             image = e.target.loader.content as Bitmap;
  65.             imageData = image.bitmapData;
  66.             //キャンバス用スプライト
  67.             _canvas = new Sprite;
  68.             
  69.             var p:RectanglePiece = new RectanglePiece();
  70.             p.x0 = 0;
  71.             p.y0 = 0;
  72.             p.x1 = imageData.width;
  73.             p.y1 = imageData.height;
  74.             p.c = 0;
  75.             //フラクタルデータ保持用配列に初期値挿入
  76.             fillRectangleArray = new Array(p);
  77.             
  78.             addChild(_canvas);
  79.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  80.         }
  81.         
  82.         //ループ
  83.         private function onEnterFrame(e:Event):void 
  84.         {
  85.             //フラクタル処理終了
  86.             if (fillRectangleArray.length < 1) {
  87.                 removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  88.                 var tx:TextField = new TextField();
  89.                 tx.text = '終了';
  90.                 tx.textColor = 0xFFFFFF;
  91.                 addChild(tx);
  92.             }else {
  93.                 //フラクタルデータ保持用配列から1つ取り出す
  94.                 var rect:RectanglePiece = fillRectangleArray.shift();
  95.                 var cArray:Array = deviationLogic(rect.x0, rect.y0, rect.x1, rect.y1);
  96.                 rect.c = cArray[0];
  97.                 var halfWidth:Number = (rect.x1 - rect.x0) / 2;
  98.                 var halfHeight:Number = (rect.y1 - rect.y0) / 2;
  99.                 // 指定した矩形内の輝度の標準偏差値が閾値以上なら2分木して処理続行
  100.                 if (rect.c > THRESHOLD && (halfWidth > 2 || halfHeight > 2)) {
  101.                     //矩形を書くよ
  102.                     _canvas.graphics.lineStyle(0, 0xAAAAAA);
  103.                     _canvas.graphics.beginFill(cArray[1]);
  104.                     _canvas.graphics.drawRect(rect.x0, rect.y0, (rect.x1 - rect.x0), (rect.y1 - rect.y0));
  105.                     
  106.                     //矩形を2分割してフラクタルデータ保持用配列に突っ込む
  107.                     var rect0:RectanglePiece = new RectanglePiece();
  108.                     var rect1:RectanglePiece = new RectanglePiece();
  109.                     if (halfWidth > halfHeight) {
  110.                         rect0.x0 = rect.x0;
  111.                         rect0.y0 = rect.y0;
  112.                         rect0.x1 = rect.x0+halfWidth;
  113.                         rect0.y1 = rect.y1;
  114.                         fillRectangleArray.push(rect0);
  115.                         rect1.x0 = rect.x0+halfWidth;
  116.                         rect1.y0 = rect.y0;
  117.                         rect1.x1 = rect.x1;
  118.                         rect1.y1 = rect.y1;
  119.                         fillRectangleArray.push(rect1);
  120.                     }else {
  121.                         rect0.x0 = rect.x0;
  122.                         rect0.y0 = rect.y0;
  123.                         rect0.x1 = rect.x1;
  124.                         rect0.y1 = rect.y0+halfHeight;
  125.                         fillRectangleArray.push(rect0);
  126.                         rect1.x0 = rect.x0;
  127.                         rect1.y0 = rect.y0+halfHeight;
  128.                         rect1.x1 = rect.x1;
  129.                         rect1.y1 = rect.y1;
  130.                         fillRectangleArray.push(rect1);
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         /**
  136.          * 指定した矩形間の輝度の標準偏差を求める
  137.          * @param    x0    左上のx座標
  138.          * @param    y0    左上のy座標
  139.          * @param    x1    右下のx座標
  140.          * @param    y1    右下のy座標
  141.          * @return    標準偏差値とカラーの平均
  142.          */
  143.         private function deviationLogic(x0:Number,y0:Number,x1:Number,y1:Number):Array {
  144.             var rgb:uint = 0;
  145.             var r:uint = 0;
  146.             var g:uint = 0;
  147.             var b:uint = 0;
  148.             var hsb:Array = new Array();
  149.             var bArray:Array = new Array();
  150.             var br:Number = 0;
  151.             var av:Number = 0;
  152.             //輝度の平均を計算
  153.             for (var i:int = x0; i < x1;i++ ) {
  154.                 for (var j:int = y0; j < y1; j++ ) {
  155.                     rgb = imageData.getPixel(i, j);
  156.                     r += (rgb >> 16) & 255;
  157.                     g += (rgb >> 8) & 255;
  158.                     b += rgb & 255;
  159.                     hsb = uintRGBtoHSB(rgb);
  160.                     br += hsb[2];
  161.                     bArray.push(hsb[2]);
  162.                 }
  163.             }
  164.             av = br / bArray.length;
  165.             r = r / bArray.length;
  166.             g = g / bArray.length;
  167.             b = b / bArray.length;
  168.             rgb = (r << 16) | (g << 8) | (b << 0);
  169.             //標準偏差を計算
  170.             br = 0;
  171.             for (i = 0; i < bArray.length; i++ ) {
  172.                 br += (bArray[i] - av) *(bArray[i] - av);
  173.             }
  174.             return [Math.sqrt(br / bArray.length),rgb];
  175.             
  176.         }
  177.         /**
  178.          * 
  179.          * @param    rgb    RGB成分(uint)
  180.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  181.          */
  182.         private function uintRGBtoHSB(rgb:uint):Array {
  183.             var r:uint = (rgb >> 16) & 255;
  184.             var g:uint = (rgb >> 8) & 255;
  185.             var b:uint = rgb & 255;
  186.             return RGBtoHSB(r, g, b);
  187.         }
  188.         /** RGBからHSBをつくる
  189.          * @param r    色の赤色成分(0~255)
  190.          * @param g 色の緑色成分(0~255)
  191.          * @param b 色の青色成分(0~255)
  192.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  193.          */
  194.         private function RGBtoHSB(r:int, g:int, b:int):Array {
  195.             var cmax:Number = Math.max(r, g, b);
  196.             var cmin:Number = Math.min(r, g, b);
  197.             var brightness:Number = cmax / 255.0;
  198.             var hue:Number = 0;
  199.             var saturation:Number = (cmax != 0) ? (cmax - cmin) / cmax : 0;
  200.             if (saturation != 0) {
  201.                 var redc:Number = (cmax - r) / (cmax - cmin);
  202.                 var greenc:Number = (cmax - g) / (cmax - cmin);
  203.                 var bluec:Number = (cmax - b) / (cmax - cmin);
  204.                 if (r == cmax) {
  205.                     hue = bluec - greenc;
  206.                 } else if (g == cmax) {
  207.                     hue = 2.0 + redc - bluec;
  208.                 } else {
  209.                     hue = 4.0 + greenc - redc;
  210.                 }
  211.                 hue = hue / 6.0;
  212.                 if (hue < 0) {
  213.                     hue = hue + 1.0;
  214.                 }
  215.             }
  216.             return [hue, saturation, brightness];
  217.         }
  218.     }    
  219. }
  220.     /**
  221.      * ...
  222.      * @author DefaultUser (Tools -> Custom Arguments...)
  223.      */
  224.     class RectanglePiece 
  225.     {
  226.         public var x0:Number;
  227.         public var y0:Number;
  228.         public var x1:Number;
  229.         public var y1:Number;
  230.         public var c:Number;
  231.         public function RectanglePiece() 
  232.         {
  233.              this.x0 = 0;
  234.              this.y0 = 0;
  235.              this.x1 = 0;
  236.              this.x1 = 0;
  237.              this.c = 0;            
  238.         }
  239.         
  240.     }
noswf
  1. // forked from fumix's フラクタルで画像を描画する
  2. /**
  3. フラクタルで画像を描画
  4. パクリ元ネタ:
  5. fladdict » コンピューターに絵画を描かせる
  6. http://fladdict.net/blog/2009/05/computer-painting.html
  7. 標準偏差:
  8. http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm
  9. 画像の読み込み処理:
  10. http://wonderfl.kayac.com/code/3fb2258386320fe6d2b0fe17d6861e7da700706a
  11. RGB->HSB変換:
  12. http://d.hatena.ne.jp/flashrod/20060930#1159622027
  13. **/
  14. package 
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Loader;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.net.URLRequest;
  23.     import flash.system.LoaderContext;
  24.     import flash.text.TextField;
  25.     /**
  26.      * ...
  27.      * @author DefaultUser (Tools -> Custom Arguments...)
  28.      */
  29.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "#ffffff")]
  30.     
  31.     public class Main extends Sprite 
  32.     {
  33.         
  34.         private const IMAGE_URL:String = "http://farm4.static.flickr.com/3639/3538831894_cca4aabd68.jpg";
  35.         //標準偏差の閾値。小さくすると細かくなるけど、小さすぎるとただのモザイクみたくなる。
  36.         private const THRESHOLD:Number = 0.1;
  37.         private var fillRectangleArray:Array;
  38.         private var image:Bitmap;
  39.         private var imageData:BitmapData;
  40.         private var _canvas:Sprite;
  41.         public function Main():void 
  42.         {
  43.             if (stage) init();
  44.             else addEventListener(Event.ADDED_TO_STAGE, init);
  45.         }
  46.         
  47.         private function init(e:Event = null):void 
  48.         {
  49.             removeEventListener(Event.ADDED_TO_STAGE, init);
  50.             //画像の読み込み
  51.                         var req:URLRequest = new URLRequest(IMAGE_URL);
  52.                         var loader:Loader = new Loader();
  53.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  54.                         loader.load( req, new LoaderContext(true));
  55.                         // take a capture after 10 sec
  56.                         Wonderfl.capture_delay( 120 );
  57.         }
  58.         
  59.         //画像読み込み後の処理
  60.         function loadComplete(e:Event = null):void 
  61.         {
  62.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  63.             
  64.             image = e.target.loader.content as Bitmap;
  65.             imageData = image.bitmapData;
  66.             //キャンバス用スプライト
  67.             _canvas = new Sprite;
  68.             
  69.             var p:RectanglePiece = new RectanglePiece();
  70.             p.x0 = 0;
  71.             p.y0 = 0;
  72.             p.x1 = imageData.width;
  73.             p.y1 = imageData.height;
  74.             p.c = 0;
  75.             //フラクタルデータ保持用配列に初期値挿入
  76.             fillRectangleArray = new Array(p);
  77.             
  78.             addChild(_canvas);
  79.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  80.         }
  81.         
  82.         //ループ
  83.         private function onEnterFrame(e:Event):void 
  84.         {
  85.             //フラクタル処理終了
  86.             if (fillRectangleArray.length < 1) {
  87.                 removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  88.                 var tx:TextField = new TextField();
  89.                 tx.text = '終了';
  90.                 tx.textColor = 0xFFFFFF;
  91.                 addChild(tx);
  92.             }else {
  93.                 //フラクタルデータ保持用配列から1つ取り出す
  94.                 var rect:RectanglePiece = fillRectangleArray.shift();
  95.                 var cArray:Array = deviationLogic(rect.x0, rect.y0, rect.x1, rect.y1);
  96.                 rect.c = cArray[0];
  97.                 var halfWidth:Number = (rect.x1 - rect.x0) / 2;
  98.                 var halfHeight:Number = (rect.y1 - rect.y0) / 2;
  99.                 // 指定した矩形内の輝度の標準偏差値が閾値以上なら2分木して処理続行
  100.                 if (rect.c > THRESHOLD && (halfWidth > 2 || halfHeight > 2)) {
  101.                     //矩形を書くよ
  102.                     _canvas.graphics.lineStyle(0, 0xAAAAAA);
  103.                     _canvas.graphics.beginFill(cArray[1]);
  104.                     _canvas.graphics.drawRect(rect.x0, rect.y0, (rect.x1 - rect.x0), (rect.y1 - rect.y0));
  105.                     
  106.                     //矩形を2分割してフラクタルデータ保持用配列に突っ込む
  107.                     var rect0:RectanglePiece = new RectanglePiece();
  108.                     var rect1:RectanglePiece = new RectanglePiece();
  109.                     if (halfWidth > halfHeight) {
  110.                         rect0.x0 = rect.x0;
  111.                         rect0.y0 = rect.y0;
  112.                         rect0.x1 = rect.x0+halfWidth;
  113.                         rect0.y1 = rect.y1;
  114.                         fillRectangleArray.push(rect0);
  115.                         rect1.x0 = rect.x0+halfWidth;
  116.                         rect1.y0 = rect.y0;
  117.                         rect1.x1 = rect.x1;
  118.                         rect1.y1 = rect.y1;
  119.                         fillRectangleArray.push(rect1);
  120.                     }else {
  121.                         rect0.x0 = rect.x0;
  122.                         rect0.y0 = rect.y0;
  123.                         rect0.x1 = rect.x1;
  124.                         rect0.y1 = rect.y0+halfHeight;
  125.                         fillRectangleArray.push(rect0);
  126.                         rect1.x0 = rect.x0;
  127.                         rect1.y0 = rect.y0+halfHeight;
  128.                         rect1.x1 = rect.x1;
  129.                         rect1.y1 = rect.y1;
  130.                         fillRectangleArray.push(rect1);
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         /**
  136.          * 指定した矩形間の輝度の標準偏差を求める
  137.          * @param    x0    左上のx座標
  138.          * @param    y0    左上のy座標
  139.          * @param    x1    右下のx座標
  140.          * @param    y1    右下のy座標
  141.          * @return    標準偏差値とカラーの平均
  142.          */
  143.         private function deviationLogic(x0:Number,y0:Number,x1:Number,y1:Number):Array {
  144.             var rgb:uint = 0;
  145.             var r:uint = 0;
  146.             var g:uint = 0;
  147.             var b:uint = 0;
  148.             var hsb:Array = new Array();
  149.             var bArray:Array = new Array();
  150.             var br:Number = 0;
  151.             var av:Number = 0;
  152.             //輝度の平均を計算
  153.             for (var i:int = x0; i < x1;i++ ) {
  154.                 for (var j:int = y0; j < y1; j++ ) {
  155.                     rgb = imageData.getPixel(i, j);
  156.                     r += (rgb >> 16) & 255;
  157.                     g += (rgb >> 8) & 255;
  158.                     b += rgb & 255;
  159.                     hsb = uintRGBtoHSB(rgb);
  160.                     br += hsb[2];
  161.                     bArray.push(hsb[2]);
  162.                 }
  163.             }
  164.             av = br / bArray.length;
  165.             r = r / bArray.length;
  166.             g = g / bArray.length;
  167.             b = b / bArray.length;
  168.             rgb = (r << 16) | (g << 8) | (b << 0);
  169.             //標準偏差を計算
  170.             br = 0;
  171.             for (i = 0; i < bArray.length; i++ ) {
  172.                 br += (bArray[i] - av) *(bArray[i] - av);
  173.             }
  174.             return [Math.sqrt(br / bArray.length),rgb];
  175.             
  176.         }
  177.         /**
  178.          * 
  179.          * @param    rgb    RGB成分(uint)
  180.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  181.          */
  182.         private function uintRGBtoHSB(rgb:uint):Array {
  183.             var r:uint = (rgb >> 16) & 255;
  184.             var g:uint = (rgb >> 8) & 255;
  185.             var b:uint = rgb & 255;
  186.             return RGBtoHSB(r, g, b);
  187.         }
  188.         /** RGBからHSBをつくる
  189.          * @param r    色の赤色成分(0~255)
  190.          * @param g 色の緑色成分(0~255)
  191.          * @param b 色の青色成分(0~255)
  192.          * @return HSB配列([0]=hue, [1]=saturation, [2]=brightness)
  193.          */
  194.         private function RGBtoHSB(r:int, g:int, b:int):Array {
  195.             var cmax:Number = Math.max(r, g, b);
  196.             var cmin:Number = Math.min(r, g, b);
  197.             var brightness:Number = cmax / 255.0;
  198.             var hue:Number = 0;
  199.             var saturation:Number = (cmax != 0) ? (cmax - cmin) / cmax : 0;
  200.             if (saturation != 0) {
  201.                 var redc:Number = (cmax - r) / (cmax - cmin);
  202.                 var greenc:Number = (cmax - g) / (cmax - cmin);
  203.                 var bluec:Number = (cmax - b) / (cmax - cmin);
  204.                 if (r == cmax) {
  205.                     hue = bluec - greenc;
  206.                 } else if (g == cmax) {
  207.                     hue = 2.0 + redc - bluec;
  208.                 } else {
  209.                     hue = 4.0 + greenc - redc;
  210.                 }
  211.                 hue = hue / 6.0;
  212.                 if (hue < 0) {
  213.                     hue = hue + 1.0;
  214.                 }
  215.             }
  216.             return [hue, saturation, brightness];
  217.         }
  218.     }    
  219. }
  220.     /**
  221.      * ...
  222.      * @author DefaultUser (Tools -> Custom Arguments...)
  223.      */
  224.     class RectanglePiece 
  225.     {
  226.         public var x0:Number;
  227.         public var y0:Number;
  228.         public var x1:Number;
  229.         public var y1:Number;
  230.         public var c:Number;
  231.         public function RectanglePiece() 
  232.         {
  233.              this.x0 = 0;
  234.              this.y0 = 0;
  235.              this.x1 = 0;
  236.              this.x1 = 0;
  237.              this.c = 0;            
  238.         }
  239.         
  240.     }
noswf
Get Adobe Flash Player