2013-10-07 4 views
5

TLayout 컨트롤에서 비트 맵을 생성하려고합니다. 이렇게하려면 TControl.Makescreenshot 함수를 사용하고 있습니다. Windows에서 응용 프로그램을 테스트 할 때, 모든 것이 예상대로 작동 : 아이폰 OS, 안드로이드 (모두 에뮬레이터와 실제 장치)에서 응용 프로그램을 실행할 때FireMonkey TControl.MakeScreenshot은 모바일 플랫폼에서 크기가 작은 비트 맵을 생성합니다.

Windows 그러나

는, 결과는 주변이 (빨간색 테두리가 보이는 이미지가 단) 비트 맵의 ​​테두리 안에 그려져 :

iOS Screenshot

를 모바일 버전에서 이미지의 절반 크기이며, 테두리가 잘려.

저는 여기에 사용되는 코드입니다 :

(를 .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 

픽셀 밀도가 할 수있는 문제 일 경우, 혹은 FireMonkey입니다 곤충?

+0

이미지 1의 정렬은 'alClient'입니다. 정렬을 'alNone'으로 설정하고 높이와 너비를 직접 설정하면 도움이됩니까? – Johan

답변

2

Firemonkey이 비트 맵은 우리가 다른 sacle 그릴 것을, 캔버스 말했다 허용 은 TBitmap, 특수 속성이 있습니다. 규모와 예를 들어 = 2. 다음 방법을 사용하십시오 :

  1. 이 실제 크기로 비트 맵을 확인 (스케일 = 2 화면에 예를 들어, PhysicalWidth = LogicalWidth * 규모)
  2. (IBitmapAccess 같은 비트 맵) .BitmapScale = 2

그런 다음 TCanvas는 품질이 향상된이 비트 맵을 그립니다.

,이 문서를보고하십시오 : 그것은 러시아에 http://fire-monkey.ru/page/articles/_/articles/graphics/graphics-screenshot

하지만, 코드 영어에 :-) 그리고 위의 내 제안 (IBitmapAccess로 (비트 맵) .BitmapScale = 2)와 함께이 문서에서 코드를 사용

고맙습니다.

3

버그 인 것 같습니다. 품질 중앙에 제출 : http://qc.embarcadero.com/wc/qcmain.aspx?d=119609

+0

[QualityCentral이 종료되었습니다] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), 더 이상 qc.embarcadero.com 링크에 액세스 할 수 없습니다 . 이전 QC 데이터에 액세스해야하는 경우 [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)를 확인하십시오. –

1

나는 동일한 문제가 있습니다. 지금까지의 유일한 해결 방법은 다음과 같습니다. 1. 새 TBitmap (Temp)을 만들고 새로 만든 비트 맵을 사용하여 이미지의 비트 맵이 수행 했어야하는 모든 작업을 수행합니다. 2.이 Temp Bitmap에 모두 그려진 후에 Temp Bitmap을 Image Example : Image1.MultiResBitmap.Items [1] .assign (TempBitmap)에 지정하십시오. 3. 이미지의 줄 바꿈 모드를 IWStretch로 설정하십시오.

이 해결 방법은 저에게 효과적 이었지만 이미지 렌더링 속도가 느려졌습니다. 나는 정말로 그 문제가 빨리 해결되기를 바란다.

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

감사합니다. Christo, 해결 방법을 시도해 보겠습니다. 다행히도 다음 XE5 패치에서이 문제가 수정 될 것입니다. – norgepaul