TBitBtnのGlyphで、256色ビットマップを指定したのですが、
Windowsが256色モードのとき、
ビットマップがモノクロ表示のようになって、
きちんと表示されません。
Windowsが、TrueColorやHighColorの時はちゃんと表示されるのですが。
Googleでいろいろ調べたところ、
256色モードでは、パレットを設定する必要があるのでは?
と、思いまして、パレットを指定してコントロールを最描写したり
しているのですが、うまくいかないのです。
パレットをいじるという方針はあっているのでしょうか。
はたまた、原因はまったく別のところにあるのでしょうか。
みなさんは、どうやって256色ビットマップを表示させているのか、
お教えいただけないでしょうか。
ちなみに、TImageのJpeg画像でも、同じように画像が劣化されて表示されます。
256色モードでは、システム色に固定で16色分使われてしまいますが、それはよろしいんですよね。
近似値で表示したいのであれば、
http://www.borland.co.jp/qanda/cbuilder/c0003356.html
こちら。
「近似値」ですので、色によっては劣化しているように見えるかもしれません。
すばやいレスありがとうございます。
よくわからないのですが、システム色の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上のビットマップを再描写するという方法は、あっているのでしょうか。
質問ばかりで申し訳ありませんが、よろしければご指導お願いします。
それでOKだと思います。
ただ、私の環境には256色の設定が出来るPCがないのでテスト出来ません。
Canvasを、新規に作成した真っ白なTBitmapにし、真っ白なTBitmapの色深度を8bitにして、そのTBitmapをTBitBtnのGlyphに設定しても駄目でしょうか。
たびたびアドバイスありがとうございます。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の後でいいのでしょうか。
できれば、ヒントだけでもお願いします。
これでどうでしょうか。
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;
すいません。レス遅くなりました。
にしのさんのソースを参考にして、
XPの256色互換モードとMEの256色モードで試したところ、
次のようになりました。
1) フォームが標準色で、フォーム上にTBitBtnが1つの場合
TBitBtn.Glyphは近似色で表示されました。
ただ、ほかのソフトを操作すると、色を奪われるようです。
2) フォームの色を他の色に変更した場合
3) TBitBtnが複数ある場合
TBitBtn.Glyphに色が割り当てられないためか、劣化して表示されます。
フォームにシステム色を奪われているからかもしれません。
(ただ単に、私の技術が低いためもあるでしょう・・・。)
あくまで、私のテスト環境での話ですが、
とりあえず、1)ではうまくいきましたので、解決とさせていただきます。
にしのさん、本当に、どうもありがとうございました。
ツイート | ![]() |