2011-08-04 29 views
5

estoy usando código de barras Studio 2011 para pintar un código QR en un Graphics32 - TImage32 de componentes y quiero guardarlo en formato png, pero con el color blanco lo más transparente esto he especificado en el OuterColor de Graphics32.Cómo guardar un archivo png con transparencia?

OnFormCreate acabo

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    psBarcodeComponent1.BarCode := 'some text here...'; 
end; 

y por el momento no tengo el cuadro asignado a un clic de botón Evento

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; 

estoy usando la biblioteca de imágenes de Vampyre para convertir el mapa de bits en formato PNG pero con mucho gusto usaré cualquier biblioteca, función y consejo. ¡He estado tratando de hacer esto ahora por casi una semana! He leído y releído la documentación de graphics32 y también de Vampyre Imaging Library, pero nada de lo que intento convertirá el blanco en un color transparente. He tratado clWhite, clWhite32 y también establecer el modoDraw a dmBlend y aplicando la función ChromaKey todo fue en vano, pero la frustración montón, café y un poco de cerveza también;)

Esta es la forma en que estoy guardando ...

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; 

Esto se traduce en una miniatura de color Negro y cuando se ve en el visor de fotos de Windows es completamente transparente.

espero que he proporcionado suficiente información y que alguien es capaz de ayudarme.

Chris

+0

lo que ocurre cuando se establece bmp.transparentColor: = clWhite; en lugar de bmp.outerColor: = clWhite? – ComputerSaysNo

+0

No hay ningún miembro para eso en TBitmap32 - También he intentado elegir el OuterColor de un Pixel pero no tiene ningún efecto. bmp.OuterColor: = bmp.Pixel [0,1]; – Shambhala

Respuesta

4

Este enfoque funciona para mí:

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; 

Este utiliza el GR32 PNG library. Es una forma bastante directa, al configurar todos los píxeles blancos a transparente.

PS: Image321 es un componente TImage32, que contiene mi TBitmap32.

+0

este ejemplo me tiene un error en el procedimiento de "TCustomBitmap32.Assign (Fuente: TPersistent)". GR32.pas en la unidad; ayuda? – XBasic3000

3

No ha especificado la versión de Delphi, pero si su versión de Delphi tiene "PngImage" (creo que viene con D2009 +) del fuelle código funciona perfectamente (cargado en Gimp y Windows visor de fotos, se dibuja un marco y un texto con fondo transparente, no dude en jugar con él:

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; 
+0

Gracias por eso, cambiaré a un TImage estándar y probaré su código adaptado. Estoy utilizando Delphi 2010 – Shambhala

+0

Delphi 2010 se encargará de esto perfectamente, no se olvide de que TImage también tiene algunas opciones transpiracy y aceptarlo como respuesta si es útil. (: – ComputerSaysNo

Cuestiones relacionadas