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()
少なくとも、こうすればソートしてから数えるよりよっぽど速い。しかし、もっと速い方法は無いものだろうか・・・
コメント
コメントを投稿