TBitBtnのGlyphで指定した256色ビットマップが256色モードできちんと表示できません。

解決


will  2003-12-08 06:59:54  No: 5977

TBitBtnのGlyphで、256色ビットマップを指定したのですが、
Windowsが256色モードのとき、
ビットマップがモノクロ表示のようになって、
きちんと表示されません。
Windowsが、TrueColorやHighColorの時はちゃんと表示されるのですが。

Googleでいろいろ調べたところ、
256色モードでは、パレットを設定する必要があるのでは?
と、思いまして、パレットを指定してコントロールを最描写したり
しているのですが、うまくいかないのです。
パレットをいじるという方針はあっているのでしょうか。
はたまた、原因はまったく別のところにあるのでしょうか。
みなさんは、どうやって256色ビットマップを表示させているのか、
お教えいただけないでしょうか。
ちなみに、TImageのJpeg画像でも、同じように画像が劣化されて表示されます。


にしの  2003-12-08 19:17:03  No: 5978

256色モードでは、システム色に固定で16色分使われてしまいますが、それはよろしいんですよね。

近似値で表示したいのであれば、
http://www.borland.co.jp/qanda/cbuilder/c0003356.html
こちら。
「近似値」ですので、色によっては劣化しているように見えるかもしれません。


will  2003-12-09 07:32:43  No: 5979

すばやいレスありがとうございます。

よくわからないのですが、システム色の16色というのは、
フォームなどに使われる色のことでしょうか。
一応、16色のビットマップは、
予約色で表示されているように見えます。

にしのさんの紹介してくれたページのソースをDelphi風に直すと、
C++は、よくわからないので自信ないのですが、こんな感じでしょうか。

var
  hpal:HPALETTE;
  Bitmap:Graphics.TBitmap;
begin
  hpal := CreateHalftonePalette(Canvas.Handle);
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile('C:\abc.bmp');

  //以下の関数は記述通り2回ずつ呼び出して下さい
  SelectPalette(Canvas.Handle, hpal, True);
  RealizePalette(Canvas.Handle);
  SelectPalette(Canvas.Handle, hpal, True);
  RealizePalette(Canvas.Handle);
end;

で、このソースでいろいろ試行錯誤して、この後に続けて、
PaletteChanged(True);
invalidate;
などと、やってみたのですが、
TBitBtn上のビットマップは、近似されません。
TBitBtn上のビットマップを再描写するという方法は、あっているのでしょうか。
質問ばかりで申し訳ありませんが、よろしければご指導お願いします。


にしの  2003-12-09 17:55:50  No: 5980

それでOKだと思います。
ただ、私の環境には256色の設定が出来るPCがないのでテスト出来ません。

Canvasを、新規に作成した真っ白なTBitmapにし、真っ白なTBitmapの色深度を8bitにして、そのTBitmapをTBitBtnのGlyphに設定しても駄目でしょうか。


will  2003-12-10 15:48:08  No: 5981

たびたびアドバイスありがとうございます。willです。

テスト環境については、Meで行う場合もありますが、
普段のOSがXPですので、ファイルの右クリックから設定できる、
互換モードの256色で実行しています。

それで、にしのさんのアドバイスされたようにすると、
こんなかんじでしょうか。

var
  hpal:HPALETTE;
  Bitmap:Graphics.TBitmap;
begin
  hpal := CreateHalftonePalette(Canvas.Handle);
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile('C:\abc.bmp');
  Bitmap.PixelFormat := pf8bit; //色深度の設定?

  //以下の関数は記述通り2回ずつ呼び出して下さい
  SelectPalette(Canvas.Handle, hpal, True);
  RealizePalette(Canvas.Handle);
  SelectPalette(Canvas.Handle, hpal, True);
  RealizePalette(Canvas.Handle);

  PaletteChanged(True);
  invalidate;
  BitBtn1.Glyph := Bitmap;
end;

Glyphの設定を、いつ行うのかが、いまいち自信ありません。
PaletteChangedの後でいいのでしょうか。
できれば、ヒントだけでもお願いします。


にしの  2003-12-10 18:26:58  No: 5982

これでどうでしょうか。

var
  hpal:HPALETTE;
  bmpFile: TBitmap;     //ファイル用
  bmpInternal: TBitmap; //BitBtn.Glyph設定用
begin
  bmpFile := TBitmap.Create;
  bmpInternal := TBitmap.Create;
  hpal := CreateHalftonePalette(bmpInternal.Canvas.Handle);
  try
    bmpFile.LoadFromFile(ExtractFilePath(Application.ExeName) + 'test.bmp');
    bmpInternal.Width := bmpFile.Width;
    bmpInternal.Height := bmpFile.Height;

    //以下の関数は記述通り2回ずつ呼び出して下さい
    SelectPalette(bmpInternal.Canvas.Handle, hpal, True);
    RealizePalette(bmpInternal.Canvas.Handle);
    SelectPalette(bmpInternal.Canvas.Handle, hpal, True);
    RealizePalette(bmpInternal.Canvas.Handle);

    bmpInternal.Canvas.Draw(0, 0, bmpFile);

    BitBtn1.Glyph := bmpInternal;
  finally
    bmpInternal.Free;
    bmpFile.Free;
  end;
end;


will  2003-12-12 06:15:38  No: 5983

すいません。レス遅くなりました。

にしのさんのソースを参考にして、
XPの256色互換モードとMEの256色モードで試したところ、
次のようになりました。

1) フォームが標準色で、フォーム上にTBitBtnが1つの場合
TBitBtn.Glyphは近似色で表示されました。
ただ、ほかのソフトを操作すると、色を奪われるようです。

2) フォームの色を他の色に変更した場合
3) TBitBtnが複数ある場合
TBitBtn.Glyphに色が割り当てられないためか、劣化して表示されます。
フォームにシステム色を奪われているからかもしれません。
(ただ単に、私の技術が低いためもあるでしょう・・・。)

あくまで、私のテスト環境での話ですが、
とりあえず、1)ではうまくいきましたので、解決とさせていただきます。
にしのさん、本当に、どうもありがとうございました。


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

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






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