Delphi Tips 
-----------------------------

0270  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/21 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/21 osamu 編集
Delphi4 で TBitmap を pf1bit で使うときの注意点(不具合回避)

TBitmap は pf1bit で Width/Height が共に 0 以上になると 1bpp DIB を作成しますが、2色のカラーテーブルを初期化していません。

さらに、Width/Height が 0 以上の TBitmap を PixelFormat で pf1bit へ形式変換する場合
    DDB -> 1bpp DIB 変換なら 黒白2色のカラーテーブルが作られます。 -> OK
    DIB -> 1bpp DIB 変換なら 古いカラーテーブルが引き継がれます。   -> バグ
となります。

結局、PixelFormat := pf1bit; がまともに動くのは、古い PixelFormat の値が pfDevice で Width > 0, Height > 0 の場合だけです。たとえば,以下のようなコードで問題が発生します。

  Bitmap1 := TBitmap.Create;        // スクリーン互換 DDB を作成
  Bitmap1.PixelFormat := pf1bit;    // Size がゼロのまま 1bit DIB に変換
  Bitmap1.Width := 1000;
  Bitmap1.Height := 1000;

これを、

  Bitmap1 := TBitmap.Create;        // スクリーン互換 DDB を作成
  Bitmap1.Width := 1000;
  Bitmap1.Height := 1000;
  Bitmap1.PixelFormat := pf1bit;    // Size を設定してから 1bit DIB に変換

とすれば、正常に動きます。ただし、一旦ばかでかい DDB ができてしまうので,リソースの消費が問題になります。この場合には、以下のようにするのがベストでしょう。

  Bitmap1 := TBitmap.Create;        // スクリーン互換 DDB を作成
  Bitmap1.Width := 1;
  Bitmap1.Height := 1;
  Bitmap1.PixelFormat := pf1bit;    // 小さな Size を設定してから 1bit DIB に変換
  Bitmap1.Width := 1000;
  Bitmap1.Height := 1000;           // 大きくする

基礎知識:
    TBitmap.Monochrome=True;    は 1bit DDB
    TBitmap.PixelFormat:=pf1bit; は 1bit DIB
を作成します。

この辺は、Delphi Magazine 3/4/5号で中村@NECさんが詳しく説明して下さっています。
参照: [Delphi-ML:42732] <画像> <バグ>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp