2016-04-24 20 views
1

Wie kann eine FMX.Graphics.TBitmap in VCL.Graphics.TBitmap oder Vcl.Imaging.PngImage.TPngImage konvertiert werden?Wie kann FMX.Graphics.TBitmap in VCL.Graphics.TBitmap oder Vcl.Imaging.PngImage.TPngImage konvertiert werden?

Ich habe sowohl FMX-Formular und VCL-Formular in meinem Projekt.

+1

Ich nehme an, dass Sie auf einen Speicherstrom speichern kann, und dann laden. Es kann jedoch effizienter sein, Map zu verwenden, um die Bitmap-Daten zu erhalten, und dann auf diese Weise eine neue VCL-Bitmap aufzufüllen. –

Antwort

1

Dank David Heffernan und einige Suche schrieb ich diese Funktionen wie folgt.

ich komme zuerst mit der Funktion, die nicht Alpha

function ConvertFmxBitmapToVclBitmap(b:FMX.Graphics.TBitmap):Vcl.Graphics.TBitmap; 
var 
    data:FMX.Graphics.TBitmapData; 
    i,j:Integer; 
    AlphaColor:TAlphaColor; 
begin 
    Result:=VCL.Graphics.TBitmap.Create; 
    Result.SetSize(b.Width,b.Height); 
    if(b.Map(TMapAccess.Readwrite,data))then 
    try 
    for i := 0 to data.Height-1 do begin 
     for j := 0 to data.Width-1 do begin 
     AlphaColor:=data.GetPixel(i,j); 
     Result.Canvas.Pixels[i,j]:= 
      RGB(
      TAlphaColorRec(AlphaColor).R, 
      TAlphaColorRec(AlphaColor).G, 
      TAlphaColorRec(AlphaColor).B); 
     end; 
    end; 
    finally 
    b.Unmap(data); 
    end; 
end; 

und ich schrieb konvertieren die zweite Funktion FMX.Graphics.TBitmap zu Vcl.Imaging.PngImage.TPngImage und unterstützt Alpha unterstützt.

function ConvertFmxBitmapToPng(b:FMX.Graphics.TBitmap):Vcl.Imaging.PngImage.TPngImage; 
var 
    data:FMX.Graphics.TBitmapData; 
    i,j:Integer; 
    AlphaColor:TAlphaColor; 
    AlphaLine:VCL.Imaging.PngImage.pByteArray; 
begin 
    result:=TPngImage.CreateBlank(COLOR_RGBALPHA, 8, b.Width, b.Height);; 
    if(b.Map(TMapAccess.Readwrite,data))then 
    try 
    for i := 0 to data.Height-1 do begin 
     AlphaLine:=Result.AlphaScanline[i]; 
     for j := 0 to data.Width-1 do begin 
     AlphaColor:=data.GetPixel(j,i); 
     AlphaLine^[j]:=TAlphaColorRec(AlphaColor).A; 
     Result.Pixels[j,i]:= 
      RGB(
      TAlphaColorRec(AlphaColor).R, 
      TAlphaColorRec(AlphaColor).G, 
      TAlphaColorRec(AlphaColor).B); 
     end; 
    end; 
    finally 
    b.Unmap(data); 
    end; 
end; 
+0

Dies ist extrem langsam naive Lösung. Schau mal https://delphi-foundations.googlecode.com/svn/trunk/XE2%20book/13.%20Native%20APIs/Taking%20a%20screenshot/ScreenshotForm.pas –

0

Korrektur mit rechteckigen Bildern zu arbeiten:

function 
    ConvertFmxBitmapToVclBitmap(b:FMX.Graphics.TBitmap):Vcl.Graphics.TBitmap; 
var 
    data:FMX.Graphics.TBitmapData; 
    i,j:Integer; 
    AlphaColor:TAlphaColor; 
begin 
    Result:=VCL.Graphics.TBitmap.Create; 
    Result.SetSize(b.Width,b.Height); 
    if(b.Map(TMapAccess.Readwrite,data))then 
    try 
    for i := 0 to data.Height-1 do begin 
     for j := 0 to data.Width-1 do begin 
     AlphaColor:=data.GetPixel(j,i); 
     Result.Canvas.Pixels[j,i]:= 
      RGB(
      TAlphaColorRec(AlphaColor).R, 
      TAlphaColorRec(AlphaColor).G, 
      TAlphaColorRec(AlphaColor).B); 
     end; 
    end; 
    finally 
    b.Unmap(data); 
    end; 
end; 
+1

In Englisch, bitte. –