Bitmap のパレットに使いたい色を追加する
|
>どうやれば どんなBMP にでも 画像を悪化 せずに
>自分で指定した色で文字を描画出来るようになるのでしょうか
取りあえず、こんな処理はどうでしょう?
var bm: TBitmap;
pal: TMaxLogPalette;
PalSize: WORD;
i: Integer;
const Colors: array[0..15] of TColor =
(clBlack, clMaroon, clGreen, clOlive,
clNavy, clPurple, clTeal, clSilver,
clGray, clRed, clLime, clYellow,
clBlue, clFuchsia, clAqua, clWhite); // VGA Colors
:
:
bm := TBitmap.Create;
bm.LoadFromFile('c:\windows\雲.bmp');
// パレットエントリ数を得る
GetObject(bm.Palette, 2, @PalSize);
// パレットの色を取得
GetPaletteEntries(bm.Palette, 0, PalSize-1, pal.palPalEntry);
// パレットのエントリを16色分ずらす
for i := PalSize-1 + 16 downto 16 do
if i < 256 then
pal.palPalEntry[i] := pal.palPalEntry[i-16];
// ずらして空いた部分に VGA カラーを埋め込む
for i := 0 to 15 do begin
pal.palPalEntry[i].peRed := GetRValue(Colors[i]);
pal.palPalEntry[i].peGreen := GetGValue(Colors[i]);
pal.palPalEntry[i].peBlue := GetBValue(Colors[i]);
pal.palPalEntry[i].peFlags := 0;
end;
if Palsize + 16 > 256 then
pal.palNumEntries := 256
else
pal.palNumEntries := PalSize + 16;
pal.palVersion := $0300;
// VGA カラーを足したパレットをビットマップにセット
// TBitmap は新しいパレットで色の劣化が最小限に
// なるように自動的にカラーマッチをやり直してくれます。
bm.Palette := CreatePalette(PLogPalette(@pal)^);
これで VGA Color が描けるビットマップになると思います。
ほとんど色は劣化しません。ただ、パレットの後半に重要な色が有ると多少劣化するかも。そこまでやるには VGA Color を挿入する前にパレットの色を明るさの降順に並べ替える処理を入れた方がいいと思います。
また、VGA Colors と同色の色が有った場合、その色を挿入しないようにすれば、より品質が向上すると思います。
|
|