Как сохранить файл PNG с прозрачностью? - PullRequest
5 голосов
/ 05 августа 2011

Я использую Barcode Studio 2011 для рисования QR-кода в компонент Graphics32 - TImage32 и хочу сохранить его в формате png, но с прозрачным белым цветом, который я указал в OuterColor of Graphics32.

OnFormСоздать у меня только

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 она становится полностью прозрачной.

Я надеюсь, что предоставил достаточно информации и кто-то может мне помочь.

Chris

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Этот подход работает для меня:

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.

3 голосов
/ 05 августа 2011

Вы не указали версию 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...