Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除BMP背景并使用Delphi转换为trasparent PNG_Delphi_Png_Alpha Transparency_Tbitmap - Fatal编程技术网

删除BMP背景并使用Delphi转换为trasparent PNG

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

我有一个TBitmap,在TBitmap中有一个“地图图像”(地图图像)。此地图图像有白色背景和大量黑线(无反序列化,只有2种颜色的白色背景和黑线)

现在我必须这样做:

  • 从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;