« Exim | メイン | 結婚10年&わんこ »

2005年05月13日

画像に使用されている色数をカウントする方法

すでにネタ不足気味だったりします。^^;;

以下の関数を使用すると画像(Bitmap)の色数をカウントすることが出来ます。
私はこの機能をJTrimに実装するときに初めてTBitsの存在を知りました。
知らない方も多いのではないでしょうか?

フルカラー画像の場合、最大1677万色使用されるので、TBitsを使用しないとメモリも大変なことになってしまいます。
覚えておくと何かと便利です。

基本的にこの投稿が読まれているかどうかも解らないので、自分の経験から勝手に書いていますが、
ご希望のネタがあったら教えてください。掲載できるものは載せたいと思います。

#長くなりすぎるものや、著作権が私にないコードなどは無理ですが。。。

function GetColorCount(Bmp: TBitmap): Longint;
var
  ColorBits: TBits;
  tmpBmp: TBitmap;
  pBuff: Pointer;
  x, y, cl: Longint;
begin
  Result := 0;
  ColorBits := TBits.Create;
  try
    // TBitsのサイズをフルカラーの最大値(1677万色)に設定する。
    ColorBits.Size := 16777216;
    tmpBmp := TBitmap.Create;
    try
      tmpBmp.Assign(Bmp);
      // メモリアクセスしやすいよう、32bitカラーに変換
      tmpBmp.PixelFormat := pf32bit;
      for y := 0 to tmpBmp.Height - 1 do
      begin
        // 行のポインタを取得(ScanLine)
        pBuff := tmpBmp.ScanLine[y];
        for x := 0 to tmpBmp.Width - 1 do
        begin
          // 4バイト単位で読み込む。
          // 詳細は省略するが,$00BBGGRRの形式となるので、
          // そのままTBitsのIndexとして使用する
          cl := PDWord(pBuff)^;
          if not ColorBits[cl] then
          begin
            // 初めての色の場合は、カウンタのインクリメント
            Inc(Result);
            ColorBits[cl] := True;
          end;
          // ポインタ移動
          Inc(PDWord(pBuff));
        end;
      end;
    finally
      tmpBmp.Free;
    end;
  finally
    ColorBits.Free;
  end;
end;

投稿者 woodybells : 2005年05月13日 00:29

トラックバック

このエントリーのトラックバックURL:
http://sv59.xserver.jp/~woodybells/woodybells.com/mt/mt-tb.cgi/8

コメント

はじめまして。

自分もDelphiでフォトレタッチソフトをつくろうとしてるので、すっごく勉強になります。しっかり読ませていただきます(笑)

投稿者 Souichi K. : 2005年09月19日 20:48

お役に立てれば光栄ですm(__)m

投稿者 woodybells : 2005年09月20日 21:27

コメントしてください




保存しますか?