Delphi FMX painto()位于不同的文件中
我有一个小问题,我正试图将一部分TLayout(LayoutScale)保存在Timage(ImmagineCreata)中。由于TLayout(LayoutScala)非常大,我想将其分解为许多图像8000x8000,但我得到的是许多大小正确的图像,但都是白色的,只有第一个图像填充了TLayout的所有内容,但却爬到了8000x8000上Delphi FMX painto()位于不同的文件中,delphi,firemonkey,Delphi,Firemonkey,我有一个小问题,我正试图将一部分TLayout(LayoutScale)保存在Timage(ImmagineCreata)中。由于TLayout(LayoutScala)非常大,我想将其分解为许多图像8000x8000,但我得到的是许多大小正确的图像,但都是白色的,只有第一个图像填充了TLayout的所有内容,但却爬到了8000x8000上 procedure TForm1.Button1Click(Sender: TObject); var ImmagineCreata : FMX.G
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在您的产品线中
尝试LayoutScala.painto(ImmagineCreata.Canvas..)
我相信您误解了TLayout.painto(ACanvas,ARect)
方法。
ARect指定要绘制的acanva(目标)的矩形区域,而不是源画布中的矩形区域
因为您在目标位图之外写入了所有正方形(第一个x=1,y=1除外),所以对于所有其他x和y组合,您只得到了白色位图
为了得到想要的结果,您需要首先将整个布局复制到中间位图(与TLayout大小相同)并在x和y的嵌套for循环中使用方法
Bitmap.Canvas.DrawBitmap
,该方法允许您切换源矩形和目标矩形。我通过自动移动滚动并创建屏幕截图来解决问题8000×8000像素大小的图像已经非常大了。我会把它切成小块。例如,许多地图应用程序创建者使用256×256像素大小的图像。请不要将代码作为图像发布。这完全是无用的浪费。但解决方案是什么呢?我无法在TBitmap中通过TLayout,因为TBitmap大于10000x1000,因此无法创建。firemonkey通常将TBitmap大小限制为65536 x 65536像素,但在Windows平台上,DirectX将TBitmap大小进一步限制为8192 x 8192像素。我没有看到从画布中只提取部分矩形的替代方法。该方法“TControl.PaintTo”重定向画布并调用PaintInternal方法,该方法始终绘制整个区域。与VCL TCanvas相反,firemonkey TCanvas至少不提供逐像素访问的属性像素。这就是为什么您必须考虑应用程序的另一种结构。如何填充布局?