2013-10-07 16 views
5

Bir TLayout denetiminden bir bitmap oluşturmaya çalışıyorum. Bunu yapmak için TControl.Makescreenshot işlevini kullanıyorum. Windows üzerinde uygulama test edilirken, her şey beklendiği gibi çalışır: iOS, Android (hem emülatörlerine ve reel) cihazlarda uygulamayı çalıştırırkenFireMonkey TControl.MakeScreenshot, Mobil platformlarda küçük bir bitmap oluşturur

Windows Ancak

, sonuç etrafında bu (kırmızı sınır gibi görünüyor görüntü sadece) bitmapin sınırında içine çekilir:

iOS Screenshot

mobil versiyonda görüntü yarısı büyüklüğündedir ve sınır kırpılır.

İşte kullandığım kod:

(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 

piksel yoğunluğu ile ilgisi sorun şey mi yoksa bir FireMonkey olduğunu böcek?

+0

Image1, 'alClient' dizisinin bir hizalamasına sahiptir. Hizalamayı "alNone" olarak ayarlar ve Yüksekliği ve Genişliği kendiniz belirlerseniz, bu yardımcı olur mu? – Johan

cevap

2

FireMonkey bu bitmap farklı sacle ile çizmek gerektiğini, Tuval söyledi izin TBitmap için özel bir özelliği vardır. Ölçeği ile Örnek için = 2. sonraki yaklaşım kullanın:

  1. fiziksel boyutu ile Bitmap olun (Ölçek = 2 ekranda örneğin PhysicalWidth = LogicalWidth * Ölçek)
  2. (IBitmapAccess olarak Bitmap) .BitmapScale = 2

Bundan sonra TCanvas, bu bitmapi daha yüksek kalitede çekecektir.

, bu makaleye bakınız: Rusya'da üzerindedir http://fire-monkey.ru/page/articles/_/articles/graphics/graphics-screenshot

ancak kod İngilizcesi :-) Ve yukarıda benim öneri (IBitmapAccess olarak (Bitmap) .BitmapScale = 2) ile bu makaleden kodu kullanın

Teşekkür ederiz

3

Bu bir hata gibi görünüyor. Kalite Merkezine: http://qc.embarcadero.com/wc/qcmain.aspx?d=119609

+0

[QualityCentral'in şimdi kapatıldığını] unutmayın (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), böylece 'qc.embarcadero.com' bağlantılarına artık erişemezsiniz. . Eski QC verilerine erişmeniz gerekiyorsa, [QCScraper] 'a bakın (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –

1

Aynı sorunu yaşıyorum. Şimdiye kadar yaptığım tek çözüm şu şekildedir: 1. Yeni bir TBitmap (Temp) oluşturun ve Image'in Bitmap'inin yapması gereken her şeyi yapmak için yeni oluşturulan bitmap ile çalışın. 2. Bu Temp Bitmap'inde her şey çizildikten sonra Temp Bitmap'i Görüntü örneğine atayın: Image1.MultiResBitmap.Items [1] .assign (TempBitmap). 3. Görüntünün sarma modunu IWStretch olarak ayarlayın.

Bu geçici çözüm benim için işe yaradı, ancak görüntü için daha yavaş bir görüntü oluşturmaya neden oldu. Umarım yakında çözülür umarım.

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

Teşekkürler Christo, geçici çözümlerinizi deneyeceğim. Umarım bu, bir sonraki XE5 yamaunda giderilecektir. – norgepaul

İlgili konular