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

0138  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/11 osamu 編集
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 と同色の色が有った場合、その色を挿入しないようにすれば、より品質が向上すると思います。
参照: [Delphi-ML:24045] <その他Windows関連> <画像> <Windows>

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

How To
Lounge
KeyWords


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