1

私は TBitmap を持っています。TBitmap 内には「マップ イメージ」(マップのイメージ) がロードされています。このマップ イメージには、白い背景と多数の黒い線があります (アンチエイリアス処理は、白い背景と黒い線の 2 色のみです)。

今、私はこれをしなければなりません:

  • TBitmap から白い背景を削除します (透明な背景と黒い線)。
  • 可能であれば、可能な場合に限り、黒い線の色を別の色に置き換えます。
  • 結果を透明な PNG 画像として保存します。

これらが可能かどうかはわかりません。提案?

注 可能であれば、クラスまたは VCL の 3 番目の部分を使用することは避けたいと思います。プロジェクトで使用するだけなので、必要に応じて FreeImage ライブラリを使用できます。Delphi XE3 を使用しています。

4

1 に答える 1

1

pixelformat を pf1Bit に変更します。2 つのエントリを持つパレットを作成し、TPaletteEntry の値を目的の色の値に変更します (この例では赤に変更します)。TPNGImage を作成し、ビットマップを割り当て、PNG の透明度を設定します。

implementation
uses pngimage;
{$R *.dfm}

Type
  TMyPalette = Packed Record
     palVersion : Word;
     palNumEntries : Word;
     palPalEntry : Array [0..1] of TPaletteEntry;
   End;

Procedure ChangeBlackColor(bmp:TBitMap);
var
 pal:TMyPalette;
begin
   bmp.PixelFormat := pf1Bit;
   bmp.HandleType  := bmDIB;
    With pal Do
    Begin
      palVersion:=$0300;
      palNumEntries:=2;
      palPalEntry[0].peRed:= $FF;
      palPalEntry[0].peGreen:=$00;
      palPalEntry[0].peBlue:= $00;
      palPalEntry[0].peFlags:=PC_RESERVED;
      palPalEntry[1].peRed:= $FF;
      palPalEntry[1].peGreen:=$FF;
      palPalEntry[1].peBlue:= $FF;
      palPalEntry[1].peFlags:=PC_RESERVED;
    End;
   bmp.Palette := CreatePalette(pLogPalette(@pal)^)
end;



procedure TForm3.Button1Click(Sender: TObject);
var
 png:TPngimage;
 bmp:TBitmap;
begin
  // sample image
  Image1.Canvas.Rectangle(0,0,Image1.Width-1,Image1.Height-1);
  Image1.Canvas.Ellipse(1,1,Image1.Width,Image1.Height);



  bmp := Image1.Picture.Bitmap;

  ChangeBlackColor(bmp);

  png:=TPngimage.Create;
  try
     png.Assign(bmp);
     png.TransparentColor := clWhite;
     png.Transparent := true;
     Image2.Picture.Assign(png);
  finally
    png.Free;
  end;
end;

ここに画像の説明を入力

于 2013-10-23T18:12:47.163 に答える