我有一个小问题,我试图将TLayout(LayoutScale)的一部分保存在Timage(ImmagineCreata)中。由于TLayout(LayoutScala)非常大,我想在很多8000x8000的图像中都将其分解,但是我得到的是许多尺寸正确但全白的图像,只有第一张图像充满了TLayout的所有内容,但爬到了8000x8000 >
procedure TForm1.Button1Click(Sender: TObject);
var ImmagineCreata : FMX.Graphics.TBitmap;
NumImgX, NumImgY, x, y, dimensioneX, dimensioneY : integer;
begin
if (LayoutScala.Width > 8000) or (LayoutScala.Height > 8000) then
begin
//valuta il numero di immagini da fare in x e in y
NumImgX := 1 + (Round(LayoutScala.Width) div 8000);
NumImgY := 1 + (Round(LayoutScala.Height) div 8000);
//salva le immagini
for y := 1 to NumImgY do
begin
//dimensione lato in y
dimensioneY := 8000;
if (y = NumImgY) then dimensioneY := Round((NumImgY * 8000) - LayoutScala.Height);
//valuta l'altro verso
for x := 1 to NumImgX do
begin
//dimensione lato in x
dimensioneX := 8000;
if (x = NumImgX) then dimensioneX := Round((NumImgX * 8000) - LayoutScala.Width);
// Crea il rettangolo di disegno con le dimensioni dell'immagine
ImmagineCreata := FMX.Graphics.TBitmap.Create(dimensioneX, dimensioneY);
ImmagineCreata.Clear(TAlphaColorRec.White);
ImmagineCreata.Canvas.BeginScene;
//Traccia il controllo e i suoi figli nel bitmap di destinazione
try LayoutScala.PaintTo(ImmagineCreata.Canvas, RectF((x-1)*8000, (y-1)*8000, ((x-1)*8000)+dimensioneX, ((y-1)*8000)+dimensioneY));
finally ImmagineCreata.Canvas.EndScene;
end;
// Salva l'immagine
ImmagineCreata.SaveToFile('C:\Immagine'+x.ToString+'.'+y.ToString+'.jpg');
//svuota la memoria
ImmagineCreata.Free;
end;
end;
end;
end;
我使用Delphi 10.2.3和FireMonkey
答案 0 :(得分:0)
在您的行中
try LayoutScala.PaintTo(ImmagineCreata.Canvas..)
我相信您会误解TLayout.PaintTo(ACanvas, ARect)
方法。
ARect 指定要绘制的 ACanvas (目标)的矩形区域,而不是源画布中的矩形。
因为您在目标位图之外写入了所有平方(第一个x = 1,y = 1除外),所以对于其他所有x和y组合,您只能得到白色位图。
要获得所需结果,您需要首先将整个布局复制到一个中间位图(与TLayout的大小相同),然后在嵌套的for循环内使用x和y方法Bitmap.Canvas.DrawBitmap
允许您移交源矩形和目标矩形。
答案 1 :(得分:-1)
我通过自动移动滚动条并创建屏幕截图来解决