getColorBoundsRect()のバグ?

09/05/23追記 getColorBoundsRect()のバグへの対処 で対処方法考えてみた。

09/05/20追記 BitmapData.getColorBoundsRect() fails on a single pixel Adobe Bug Systemには報告済みの模様。

ビットマップデータ内の特定色の矩形領域を取得するメソッドgetColorBoundsRect()で(0, 0)に1px*1pxで描いた色が判定できなかった。

画像処理で高速化void elementを読んで、「全ピクセル走査は最後の手段」ってことで、禁じ手のgetPixel32()をgetColorBoundsRect()に置き換えてみようとしたんだけど・・・

作ってるモノが(0,0)に1px*1pxなBitmapDataも対象にしてるクラスだったんで今回は使えなかったけど、上のリンクはその名に恥じない超絶技巧なので勉強になります。

以下は色んなところに赤いBitmapDataを作ってgetColorBoundsRect()で取得できるかの(小さくて見づらい)サンプル。主に(0,0)近辺に小さなBitmapDataを作ってテストしてます。結果としては、(0,0)かつ1px*1px以外のものは大丈夫そう。

testbug_bitmapdata.swf

package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;

	public class TestBug_BitmapData extends Sprite {

		private var _counter:int;

		public function TestBug_BitmapData() {
			_counter = 0;

			test(new Rectangle(0, 0, 1, 1));
			test(new Rectangle(29, 0, 1, 1));
			test(new Rectangle(29, 29, 1, 1));
			test(new Rectangle(0, 29, 1, 1));
			test(new Rectangle(0, 1, 1, 1));
			test(new Rectangle(1, 0, 1, 1));
			test(new Rectangle(1, 1, 1, 1));
			test(new Rectangle(0, 0, 1, 2));
			test(new Rectangle(0, 0, 2, 1));
		}

		private function test(rectangle:Rectangle):void {
			_counter ++;

			var id:int = _counter;
			var bitmapData:BitmapData = new BitmapData(30, 30, false, 0xCCCCCC);
			bitmapData.fillRect(rectangle, 0xFF0000);

			var bitmap:Bitmap = new Bitmap(bitmapData);
			bitmap.x = 50;
			bitmap.y = 50 * id;
			addChild(bitmap);

			var textFormat:TextFormat = new TextFormat();
			textFormat.font = '_等幅';
			var textField:TextField = new TextField();
			textField.autoSize = TextFieldAutoSize.LEFT;
			textField.appendText('test' + id.toString() + '\n');
			textField.appendText(bitmapData.getColorBoundsRect(0xFF0000, 0xFF0000, true).toString());
			textField.setTextFormat(textFormat);
			textField.x = 100;
			textField.y = 50 * id;
			addChild(textField);
		}

	}

}
  1. package  {
  2.     import flash.display.Bitmap;
  3.     import flash.display.BitmapData;
  4.     import flash.display.Sprite;
  5.     import flash.geom.Rectangle;
  6.     import flash.text.TextField;
  7.     import flash.text.TextFieldAutoSize;
  8.     import flash.text.TextFormat;
  9.  
  10.     public class TestBug_BitmapData extends Sprite {
  11.  
  12.         private var _counter:int;
  13.  
  14.         public function TestBug_BitmapData() {
  15.             _counter = 0;
  16.  
  17.             test(new Rectangle(0, 0, 1, 1));
  18.             test(new Rectangle(29, 0, 1, 1));
  19.             test(new Rectangle(29, 29, 1, 1));
  20.             test(new Rectangle(0, 29, 1, 1));
  21.             test(new Rectangle(0, 1, 1, 1));
  22.             test(new Rectangle(1, 0, 1, 1));
  23.             test(new Rectangle(1, 1, 1, 1));
  24.             test(new Rectangle(0, 0, 1, 2));
  25.             test(new Rectangle(0, 0, 2, 1));
  26.         }
  27.  
  28.         private function test(rectangle:Rectangle):void {
  29.             _counter ++;
  30.  
  31.             var id:int = _counter;
  32.             var bitmapData:BitmapData = new BitmapData(30, 30, false, 0xCCCCCC);
  33.             bitmapData.fillRect(rectangle, 0xFF0000);
  34.  
  35.             var bitmap:Bitmap = new Bitmap(bitmapData);
  36.             bitmap.x = 50;
  37.             bitmap.y = 50 * id;
  38.             addChild(bitmap);
  39.  
  40.             var textFormat:TextFormat = new TextFormat();
  41.             textFormat.font = '_等幅';
  42.             var textField:TextField = new TextField();
  43.             textField.autoSize = TextFieldAutoSize.LEFT;
  44.             textField.appendText('test' + id.toString() + '\n');
  45.             textField.appendText(bitmapData.getColorBoundsRect(0xFF0000, 0xFF0000, true).toString());
  46.             textField.setTextFormat(textFormat);
  47.             textField.x = 100;
  48.             textField.y = 50 * id;
  49.             addChild(textField);
  50.         }
  51.  
  52.     }
  53.  
  54. }


About this entry