TBitmap の背景を白に塗りつぶし、その上に画像を描画したり、
しなかったりしています。
そして、描画していればファイルに保存し、描画していなければ、
すなわち、全体が真っ白なら保存しないようにしたいのですが、
この2つの区別を簡単に行う方法はないでしょうか?
やはり全pixcelを調べないといけないでしょうか?
調べないといけないですね。
簡単にということなので。
簡単に調べられる関数を作りました。
(ある程度高速)
function IsBlankWhite( Bitmap: TBitmap): boolean;
const
BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,16,16,24,32); //from vcl
var
p: pByteArray;
b,x,y,w: integer;
begin
with Bitmap do
begin
Result:= False;
if Width =0 then Exit;
if Height=0 then Exit;
//8bit 以下は未対応
b:= BitCounts[ PixelFormat];
if b<8 then
Raise Exception.Create('未対応');
//x 走査の最大値
w:= (b div 8) * (Width-1);
Result:=False;
//y 走査
for y:= Height-1 downto 0 do
begin
p:= ScanLine[y];
x:= 0;
while (x<w) do
begin
if (p^[x]<>$FF) then Exit;
inc(x);
end;
end;
Result:= True;
end;
end;
//with文の with Bitmap とパラメータの Bitmap を削除すれば
//TBitmapを派生したクラスに簡単に組み込めます
白なら True そうでないなら False を返します。
(ただし、PixelFormatは pf8bit から pf32bit までの限定)
ScanLineの叩き台になりうると思います。いろいろ実験してください。
以上。
描画のきっかけでフラグを立てて終了時にフラグを調べるんじゃダメなんですか?
forever さん、ありがとうございました。
大変参考になりました。小さい画像なので、一瞬で調べることができました。
Flagさん、一応考えたのですが、描画したり消したりするルーチンが
色々とあり、フラグの管理が面倒かなと思ったもので・・・
ツイート | ![]() |