2011-08-04 35 views
5

Bir QR Kodunu bir Grafik32 - TImage32 Bileşenine boyamak için Barcode Studio 2011 kullanıyorum ve png biçiminde kaydetmek istiyorum ancak beyaz renk olarak saydam olarak tanımladım.Bir png dosyasını saydamlıkla nasıl kaydederim?

OnFormCreate Sadece

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

var ve bir Düğme tıklayın Olay atanan resim var an için

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; 

Ben PNG Format içine Bitmap dönüştürmek Vampyre Imaging Library kullanıyorum ama herhangi bir kütüphaneyi, işlevi ve tavsiyeyi memnuniyetle kullanacağım - neredeyse bir hafta boyunca bunu yapmaya çalışıyorum! Ben grafik32 ve Vampyre Imaging Library'nin belgelerini okudum ve yeniden okudum ama denediğim hiçbir şey beyazı saydam bir renge dönüştürecektir.

Bu benim kaydederek am nasıl) ...

; ben CLWhite, clWhite32 ve ayrıca dmBlend DrawMode ayarlama ve boşuna ama bol hayal kırıklığı, kahve ve biraz da bira tüm Chromakey İşlevini uygulayarak denedi
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; 

Bu, Siyah renkli bir küçük resim ile sonuçlanır ve Windows Photo Viewer'da görüntülendiğinde tamamen saydamdır.

Umarım yeterince bilgi vermişimdir ve birinin bana yardım edebileceğini umuyorum.

Chris

+0

bmp.transparentColor'u ayarladığınızda ne olur? = ClWhite; bmp.outerColor yerine: = clWhite? – ComputerSaysNo

+0

TBitmap32'de bunun için üye yok - Ayrıca bir Pixel'den OuterColor'u seçmeye çalıştım ama hiçbir etkisi yok. bmp.OuterColor: = bmp.Piksel [0,1]; – Shambhala

cevap

4

Bu yaklaşım benim için çalışıyor:

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; 

Bu 01 kullanır. Tüm beyaz pikselleri şeffaf hale getirmek için oldukça doğrudan bir yol.

PS: Image321, TBitmap32 öğemi içeren TImage32 bileşenidir.

+0

bu örnekte, bir hata var "GROSE.PAS biriminde" prosedür TCustomBitmap32.Assign (Kaynak: TPersistent) ", herhangi bir yardım? – XBasic3000

3

Sen Delphi sürümü belirtilmemiş, ancak sizin Delphi sürümü "PngImage" varsa kod feryat mükemmel (Gimp ve Windows Fotoğraf Görüntüleyicisi yüklü çalışır (ben D2009 + ile gelen inanıyoruz), bu bir çerçeve ve şeffaf arka plan ile bazı metinler çizer, onunla oynamak için çekinmeyin:

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

Bunun için, standart bir TImage'a geçeceğim ve kodunuzu uyarlamaya çalışacağım. Ben Delphi 2010 kullanıyorum – Shambhala

+0

Delphi 2010 bu mükemmel halledecek, TImage da bazı transpiracy seçenekleri vardır ve yararlı eğer cevap olarak kabul etmek unutmayın. (: – ComputerSaysNo

İlgili konular