Bitmapの無地識別

解決


deldel  2006-04-26 23:53:21  No: 21202

TBitmap の背景を白に塗りつぶし、その上に画像を描画したり、
しなかったりしています。
そして、描画していればファイルに保存し、描画していなければ、
すなわち、全体が真っ白なら保存しないようにしたいのですが、
この2つの区別を簡単に行う方法はないでしょうか?
やはり全pixcelを調べないといけないでしょうか?


forever  2006-04-27 00:38:46  No: 21203

調べないといけないですね。

簡単にということなので。
簡単に調べられる関数を作りました。
(ある程度高速)

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の叩き台になりうると思います。いろいろ実験してください。

以上。


Flag  2006-04-27 01:15:52  No: 21204

描画のきっかけでフラグを立てて終了時にフラグを調べるんじゃダメなんですか?


deldel  2006-04-27 02:03:51  No: 21205

forever さん、ありがとうございました。
大変参考になりました。小さい画像なので、一瞬で調べることができました。

Flagさん、一応考えたのですが、描画したり消したりするルーチンが
色々とあり、フラグの管理が面倒かなと思ったもので・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加