« 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