AS3でビットマップの色数を数えるには?
ふとAS3でビットマップの色数を数えたくなった。
例えば「Digital Image Processing」(p300)によると、Java的にはこんな感じになるらしい。(一部変更)
AS3に移植するのも大したことないと思ってやってみたけれど、こんなことに。遅すぎる。
琴線探査: AS3のソートって、実はかなり遅かったのね・・・
もっと高速に数えられないかを考えて、結局こんな感じに。Dictionaryクラスを使えば、まぁそれなりに速いだろうというところがポイントだ。
少なくとも、こうすればソートしてから数えるよりよっぽど速い。しかし、もっと速い方法は無いものだろうか・・・
例えば「Digital Image Processing」(p300)によると、Java的にはこんな感じになるらしい。(一部変更)
protected static int countColors(int[] pixels) {
Arrays.sort(pixels);
int k = 1;
for (int i = 0; i < pixels.length - 1; i++) {
if (pixels[i] != pixels[i+1]) {
k = k + 1;
}
}
return k;
}
なるほど。ピクセルをソートしてから、違うピクセル(カラー)値があったら一つ・・・と数えるわけだ。AS3に移植するのも大したことないと思ってやってみたけれど、こんなことに。遅すぎる。
琴線探査: AS3のソートって、実はかなり遅かったのね・・・
もっと高速に数えられないかを考えて、結局こんな感じに。Dictionaryクラスを使えば、まぁそれなりに速いだろうというところがポイントだ。
protected function countColors(pixels:Vector.<uint>):uint {
var i:uint;
var color:uint; //現在のピクセルカラー
var ccnt:uint = 0; //カラーカウント
var npix:uint = pixels.length; //ピクセル総数
var dict:Dictionary = new Dictionary(); //カラーインデックス検索用辞書
for (i = 0; i < npix; i++) {
//ピクセルカラー(ARGB)取得
color = pixels[i];
//このピクセルカラーが辞書になければ
if (dict[color] == null) {
//このピクセルカラーをキー、カラーカウントを値にして辞書に追加
dict[color] = ccnt;
//カラーカウントを増やす
ccnt++;
}
} //END for
return ccnt;
} //END countColors()
少なくとも、こうすればソートしてから数えるよりよっぽど速い。しかし、もっと速い方法は無いものだろうか・・・
コメント
コメントを投稿