2011-08-04 30 views
5

私はGraphics32-TImage32コンポーネントにQRコードをペイントするためにBarcode Studio 2011を使用しています。これをpng形式で保存しますが、白い色は透明で、これはGraphics32のOuterColorで指定しました。透明にしてpngファイルを保存するには?

OnFormCreate私はちょうど

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

を持っていると私はボタンのClickイベントに割り当てられた絵を持っている瞬間のため

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形式にビットマップを変換するVampyreイメージングライブラリを使用していますしかし、私は喜んで、ライブラリ、機能、およびアドバイスを使用します - 私はこれを今一週間近くしようとしています!私は読んでから、graphics32とVampyre Imaging Libraryのドキュメントを再読み込みしましたが、私が試したことは何も白を透明な色に変換するものではありません。

...これは私がそれを保存しています方法です)

を、私はまたclWhite、clWhite32ともdmBlendに描画モードを設定し、無駄にすべてのクロマキーを適用するが、たくさんの不満、コーヒーと少しビールを試してみました

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フォトビューアーで表示すると完全に透明になります。

私は十分な情報を提供し、誰かが私を助けてくれることを願っています。

あなたはDelphiのバージョンを指定していないが、あなたのデルファイのバージョンが「PngImage」(私はそれがD2009の+に付属していると信じて)コード怒鳴るが完璧に動作(GimpのとWindowsフォトビューアーにロードされ、それを持っている場合は、クリス

+0

bmp.transparentColor:= clWhiteを設定するとどうなりますか? bmp.outerColorの代わりに:= clWhite? – ComputerSaysNo

+0

TBitmap32にはそのメンバーはありません - 私はPixelからOuterColorを選んでみましたが効果はありません。 bmp.OuterColor:= bmp.Pixel [0,1]; – Shambhala

答えて

4

このアプローチは、私の作品:

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; 

これは01を使用しています。かなり直接的な方法です。すべての白いピクセルを透明に設定します。

PS:Image321は、TBitmap32を含むTImage32コンポーネントです。

+0

この例では、エラーが発生しました。GR32.pasの "procedure TCustomBitmap32.Assign(Source:TPersistent)" – XBasic3000

3

フレームと透明な背景を持ついくつかのテキストを描画し、それで遊ぶこと自由に感じ:

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

ありがとうございます。私は標準のTImageに切り替えて、あなたのコードを試してみます。私はDelphi 2010を使用しています – Shambhala

+0

Delphi 2010はこれを完全に処理しますが、TImageにもいくつかの透過率のオプションがあり、それが役に立つと答えた場合はそれを受け入れることを忘れないでください。 (: – ComputerSaysNo

関連する問題