Как сохранить файл PNG с прозрачностью?
Я использую Barcode Studio 2011 для рисования QR-кода в компонент Graphics32 - TImage32, и я хочу сохранить его в формате png, но с прозрачным белым цветом, который я указал в OuterColor of Graphics32.
OnFormCreate у меня только что
procedure TForm1.FormCreate(Sender: TObject);
begin
psBarcodeComponent1.BarCode := 'some text here...';
end;
и на данный момент у меня есть картина, назначенная на событие нажатия кнопки
procedure TForm1.Button8Click(Sender: TObject); // Paint the barcode
var
bmp: TBitmap32;
Coords: TRect;
begin
bmp := TBitmap32.Create;
bmp.SetSize(image.Width, image.Height);
bmp.Canvas.Brush.Color := color;
bmp.Canvas.Rectangle(-1, -1, image.Width+2, image.Height+2);
bmp.DrawMode := dmTransparent;
bmp.OuterColor := clWhite;
// make Coords the size of image
Coords := Rect(0,0,image.Width,image.Height);
psBarcodeComponent1.PaintBarCode(bmp.Canvas, Coords);
image.Bitmap.Assign(bmp);
end;
Я использую библиотеку изображений вампира для преобразования растрового изображения в формат PNG, но я с удовольствием воспользуюсь любой библиотекой, функцией и советом - я пытаюсь сделать это сейчас уже почти неделю! Я прочитал и перечитал документацию graphics32, а также Библиотеки изображений вампиров, но ничего из того, что я попробую, не преобразует белый в прозрачный цвет. Я попробовал clWhite, clWhite32, а также установил drawMode в dmBlend и применил функцию ChromaKey - все безрезультатно, но много разочарований, кофе и немного пива;)
Вот как я это сохраняю...
procedure TForm1.Button7Click(Sender: TObject); // Save with Vampyre Imaging Lib
{ Try to save in PNG format with transparancy }
var
FImage: TSingleImage;
begin
FImage := TSingleImage.Create;
ConvertBitmap32ToImage(image.Bitmap, FImage);
FImage.SaveToFile('VampyreLibIMG.png');
end;
В результате получается миниатюра черного цвета, а при просмотре в средстве просмотра фотографий Windows она становится полностью прозрачной.
Я надеюсь, что предоставил достаточно информации и кто-то может мне помочь.
Крис
2 ответа
Этот подход работает для меня:
uses GR32, GR32_PNG, GR32_PortableNetworkGraphic;
var
Y: Integer;
X: Integer;
Png: TPortableNetworkGraphic32;
function IsWhite(Color32: TColor32): Boolean;
begin
Result:= (TColor32Entry(Color32).B = 255) and
(TColor32Entry(Color32).G = 255) and
(TColor32Entry(Color32).R = 255);
end;
begin
with Image321 do
begin
Bitmap.ResetAlpha;
for Y := 0 to Bitmap.Height-1 do
for X := 0 to Bitmap.Width-1 do
begin
if IsWhite(Bitmap.Pixel[X, Y]) then
Bitmap.Pixel[X,Y]:=Color32(255,255,255,0);
end;
Png:= TPortableNetworkGraphic32.Create;
Png.Assign(Bitmap);
Png.SaveToFile('C:\Temp\NowTransparent.png');
Png.Free;
end;
end;
Для этого используется библиотека GR32 PNG. Это довольно прямой способ - установить все белые пиксели на прозрачные.
PS: Image321
это TImage32
компонент, содержащий мой TBitmap32
,
Вы не указали версию Delphi, но если ваша версия Delphi имеет "PngImage"(я думаю, что она поставляется с D2009+), код ниже работает отлично (загружается в Gimp и Windows Photo Viewer, он рисует рамку и часть текста с прозрачным фоном не стесняйтесь играть с ним:
uses
PngImage;
procedure TForm1.OnBtnClick(Sender: TObject);
var
bmp: TBitmap;
png: TPngImage;
begin
bmp := TBitmap.Create;
bmp.Width := 200;
bmp.Height := 200;
bmp.Canvas.Brush.Color := clBlack;
bmp.Canvas.Rectangle( 20, 20, 160, 160 );
bmp.Canvas.Brush.Style := bsClear;
bmp.Canvas.Rectangle(1, 1, 199, 199);
bmp.Canvas.Brush.Color := clWhite;
bmp.Canvas.Pen.Color := clRed;
bmp.Canvas.TextOut( 35, 20, 'Hello transparent world');
bmp.TransparentColor := clWhite;
bmp.Transparent := True;
png := TPngImage.Create;
png.Assign( bmp );
png.SaveToFile( 'C:\test.png' );
bmp.Free;
png.Free;
end;