AS3でビットマップの色数を数えるには?

ふとAS3でビットマップの色数を数えたくなった。

例えば「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()

少なくとも、こうすればソートしてから数えるよりよっぽど速い。しかし、もっと速い方法は無いものだろうか・・・

コメント

このブログの人気の投稿

レオナルド・ダ・ビンチはなぜノートを「鏡文字」で書いたのか?

macでsmb(samba)共有サーバーに別名で接続(別アカウント名で接続)する方法

Google DriveにCURLでアップロードするには?