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さんが詳しく説明して下さっています。 |
|