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以外のものは大丈夫そう。
- ActionScript
- Source
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);
}
}
}- 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);
- }
- }
- }
About this entry
You’re currently reading “getColorBoundsRect()のバグ?,” an entry on jp.ferv.blog
- Published:
- Tue, Apr 7th, 2009 at 6:47 PM
- Author:
- dsk
- Category:
- Web
- Tags:
- ActionScript 3.0, BitmapData
1 Comment
Jump to comment form | comments rss | trackback uri