2013-10-07 9 views
5

Ich versuche, eine Bitmap aus einem Steuerelement TLayout zu generieren. Dazu benutze ich die TControl.Makescreenshot Funktion. Wenn unter Windows die Anwendung zu testen, funktioniert alles wie erwartet:FireMonkey TControl.MakeScreenshot generiert auf mobilen Plattformen eine unterdimensionierte Bitmap

Windows

Wenn jedoch auf iOS, Android (beide Emulatoren und reale Geräte), um die Anwendung ausgeführt wird, sieht das Ergebnis wie dieses (der rote Rahmen um die Bild gezeichnet wird nur innerhalb der Grenze des Bitmap):

iOS Screenshot

In der mobilen Version das Bild ist halb so groß und die Grenze abgeschnitten wird.

Hier ist der Code, den ich verwendet:

(.pas)

unit Unit15; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 
    FMX.Objects, FMX.Layouts, FMX.Edit; 

type 
    TForm15 = class(TForm) 
    Layout1: TLayout; 
    Image1: TImage; 
    Button1: TButton; 
    CheckBox1: TCheckBox; 
    Label1: TLabel; 
    Switch1: TSwitch; 
    ArcDial1: TArcDial; 
    Edit1: TEdit; 
    Edit2: TEdit; 
    procedure Button1Click(Sender: TObject); 
    procedure FormResize(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form15: TForm15; 

implementation 

{$R *.fmx} 

procedure TForm15.Button1Click(Sender: TObject); 
begin 
    Image1.Bitmap := Layout1.MakeScreenshot; 
    Image1.Bitmap.Canvas.BeginScene; 
    try 
    Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red; 
    Image1.Bitmap.Canvas.DrawRect(RectF(1, 1, Image1.Bitmap.Width - 1, Image1.Bitmap.Height - 2), 0, 0, [], 1); 
    finally 
    Image1.Bitmap.Canvas.EndScene; 
    end; 

    Edit1.Text := format('Image = Width: %d - Height: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height]); 
    Edit2.Text := format('Original = Width: %d - Height: %d', [Round(Layout1.Width), Round(Layout1.Height)]); 
end; 

procedure TForm15.FormResize(Sender: TObject); 
begin 
    Layout1.Height := ClientHeight div 2; 
end; 

end. 

(.fmx)

object Form15: TForm15 
    Left = 0 
    Top = 0 
    Caption = 'Form15' 
    ClientHeight = 460 
    ClientWidth = 320 
    FormFactor.Width = 320 
    FormFactor.Height = 480 
    FormFactor.Devices = [dkDesktop] 
    OnResize = FormResize 
    DesignerMobile = True 
    DesignerWidth = 320 
    DesignerHeight = 480 
    DesignerDeviceName = 'iPhone' 
    DesignerOrientation = 0 
    DesignerOSVersion = '6' 
    object Layout1: TLayout 
    Align = alTop 
    ClipChildren = True 
    Height = 233.000000000000000000 
    Width = 320.000000000000000000 
    object Button1: TButton 
     Height = 44.000000000000000000 
     Position.X = 8.000000000000000000 
     Position.Y = 8.000000000000000000 
     TabOrder = 0 
     Text = 'Click to create Bitmap' 
     Trimming = ttCharacter 
     Width = 201.000000000000000000 
     OnClick = Button1Click 
    end 
    object CheckBox1: TCheckBox 
     Height = 23.000000000000000000 
     Position.X = 24.000000000000000000 
     Position.Y = 56.000000000000000000 
     TabOrder = 1 
     Text = 'CheckBox1' 
     Width = 120.000000000000000000 
    end 
    object Label1: TLabel 
     Height = 23.000000000000000000 
     Position.X = 24.000000000000000000 
     Position.Y = 88.000000000000000000 
     Text = 'Label1' 
     Width = 82.000000000000000000 
     Trimming = ttCharacter 
    end 
    object Switch1: TSwitch 
     Height = 27.000000000000000000 
     IsChecked = False 
     Position.X = 24.000000000000000000 
     Position.Y = 120.000000000000000000 
     TabOrder = 3 
     Width = 78.000000000000000000 
    end 
    object ArcDial1: TArcDial 
     Height = 81.000000000000000000 
     Position.X = 216.000000000000000000 
     Position.Y = 16.000000000000000000 
     TabOrder = 4 
     Width = 97.000000000000000000 
    end 
    object Edit1: TEdit 
     Touch.InteractiveGestures = [igLongTap, igDoubleTap] 
     TabOrder = 5 
     Position.X = 8.000000000000000000 
     Position.Y = 192.000000000000000000 
     Width = 305.000000000000000000 
     Height = 31.000000000000000000 
     KillFocusByReturn = False 
    end 
    object Edit2: TEdit 
     Touch.InteractiveGestures = [igLongTap, igDoubleTap] 
     TabOrder = 6 
     Position.X = 8.000000000000000000 
     Position.Y = 152.000000000000000000 
     Width = 305.000000000000000000 
     Height = 31.000000000000000000 
     KillFocusByReturn = False 
    end 
    end 
    object Image1: TImage 
    MultiResBitmap = < 
     item 
     end> 
    Align = alClient 
    Height = 227.000000000000000000 
    MarginWrapMode = iwOriginal 
    Width = 320.000000000000000000 
    WrapMode = iwOriginal 
    end 
end 

Ist das Problem etwas mit Pixeldichte zu tun, oder ist es ein Firemonkey Fehler?

+0

Das Image1 hat eine Ausrichtung von 'alClient'. Wenn Sie die Ausrichtung auf 'alNone' einstellen und die Höhe und Breite selbst einstellen, hilft das? – Johan

Antwort

2

Firemonkey hat eine besondere Eigenschaft für TBitmap, die Leinwand, sagte erlauben, dass dieser Bitmap wir mit verschiedenen Sacle ziehen sollte. nächsten Ansatz für Beispiel mit Skala = 2. Bitte verwenden Sie:

  1. Make Bitmap mit physikalischer Größe (zum Beispiel auf Skala = 2 Bildschirm, PhysicalWidth = LogicalWidth * Scale)
  2. (Bitmap als IBitmapAccess) .BitmapScale = 2

Danach TCanvas wird dieses Bitmap mit erhöhter Qualität ziehen.

Bitte zu diesem Artikel aussehen: http://fire-monkey.ru/page/articles/_/articles/graphics/graphics-screenshot

Es auf Russland, aber Code auf Englisch :-) Und Code verwenden, um von diesem Artikel mit meinem Vorschlag oben ((Bitmap als IBitmapAccess) .BitmapScale = 2)

Vielen Dank

3

Es sieht aus wie dies ein Fehler ist. Eingereicht zu Quality Central: http://qc.embarcadero.com/wc/qcmain.aspx?d=119609

+0

Beachten Sie, dass [Quality wurde nun heruntergefahren] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), so kann man nicht 'qc.embarcadero.com' Links Zugriff auf mehr . Wenn Sie Zugriff auf alte QC-Daten benötigen, lesen Sie [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –

1

Ich habe das gleiche Problem. Meine einzige Problemumgehung ist bisher: 1. Erstellen Sie eine neue TBitmap (Temp) und arbeiten Sie mit der neu erstellten Bitmap, um alles zu tun, was die Bitmap des Images hätte tun sollen. 2. Nachdem alles auf dieser Temp Bitmap gezeichnet wurde, weisen Sie dem Image-Beispiel die Temp Bitmap zu: Image1.MultiResBitmap.Items [1] .assign (TempBitmap). 3. Legen Sie den Umbruchmodus des Bildes auf IWStretch fest.

Diese Problemumgehung hat für mich funktioniert, aber es verursacht langsamer Rendering für das Bild. Ich hoffe wirklich, dass das bald gelöst wird.

procedure Form1.Draw; 
var 
TempBmp : FMX.Graphics.TBitmap; 
begin 
    TempBmp := FMX.Graphics.TBitmap.Create; 
    TempBmp.SetSize(round(Image1.Width),round(Image1.Height)); 
    with TempBmp.Canvas do 
    begin 
    //Work with the TempBmp here 
    end; 
    Image1.MultiResBitmap.Bitmaps[1].Assign(TempBmp); 
    Image1.Bitmap := Image1.MultiResBitmap.Bitmaps[1]; 
    TempBmp.Free; 
end; 
+0

Dank Christo, werde ich Ihre Abhilfe versuchen. Hoffentlich wird dies im nächsten XE5-Patch behoben werden. – norgepaul

Verwandte Themen