2013-10-23 81 views
1

我有一個TBitmap,在TBitmap裏面加載了一個「地圖圖像」(地圖圖像)。這張地圖圖像有一個白色背景和很多黑色線(沒有antialising只有2種顏色的白色背景和黑色線)。刪除BMP背景並使用Delphi轉換爲trasparent PNG

現在我必須這樣做:

  • 卸下TBitmap(透明背景和黑線)的白色背景;
  • 如果可能且只在可能的情況下用另一種顏色替換黑色線條顏色;
  • 保存結果作爲trasparent PNG圖像;

我不知道這些是否可能。 建議?

注意我想避免使用類或VCL的第三部分,如果可能的話。如果需要,我可以使用FreeImage庫,因爲我只是在我的項目中使用它。我使用Delphi XE3。

回答

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; 

enter image description here