删除BMP背景并使用Delphi转换为trasparent PNG
我有一个TBitmap,在TBitmap中有一个“地图图像”(地图图像)。此地图图像有白色背景和大量黑线(无反序列化,只有2种颜色的白色背景和黑线) 现在我必须这样做:删除BMP背景并使用Delphi转换为trasparent PNG,delphi,png,alpha-transparency,tbitmap,Delphi,Png,Alpha Transparency,Tbitmap,我有一个TBitmap,在TBitmap中有一个“地图图像”(地图图像)。此地图图像有白色背景和大量黑线(无反序列化,只有2种颜色的白色背景和黑线) 现在我必须这样做: 从TBitmap中删除白色背景(透明背景和黑线) 如果可能且仅在可能的情况下,用另一种颜色替换黑色线条颜色 将结果保存为trasparent PNG图像 我不知道这些是否可能。 建议 注:如果可能,我希望避免使用类的第三部分或VCL。如果需要,我可以使用FreeImage库,因为我只是在我的项目中使用它。我使用delphix
- 从TBitmap中删除白色背景(透明背景和黑线)李>
- 如果可能且仅在可能的情况下,用另一种颜色替换黑色线条颜色李>
- 将结果保存为trasparent PNG图像李>
注:如果可能,我希望避免使用类的第三部分或VCL。如果需要,我可以使用FreeImage库,因为我只是在我的项目中使用它。我使用delphixe3 将像素格式更改为pf1Bit。创建一个包含2个条目的调色板,将TpaletEntry的值更改为所需的颜色值(在所示示例中为红色)。创建一个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;
将像素格式更改为pf1Bit。创建一个包含2个条目的调色板,将TpaletEntry的值更改为所需的颜色值(在所示示例中为红色)。创建一个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;