如何在 FMX.Graphics.TBitmap 上绘制 FMX.Surface.TBitmapSurface
How to draw FMX.Surface.TBitmapSurface on FMX.Graphics.TBitmap
后续:
我需要在 FMX.Graphics.TBitmap
上绘制 TBitmapSurface
上的内容,我在网上找到了很多关于此的答案,但它们要么在 VLC
中而不是 FMX
或者他们的目标是 saving
和 loading
而不是借鉴 TBitmap
,这就是为什么我在这里问了一个新问题。
现在这是我在 TBitmapSurface
上加载图像的当前代码:
var
bitmapSurf: TBitmapSurface;
path: string;
begin
path := 'image.jpg';
bitmapSurf := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
end;
现在搜索了一下,我发现我可以在 TBitmapSurface
上使用 Scanline
,但我不知道如何使用它在 TBitmap
上绘图,网上有些人用过 TBitmap.canvas.draw
,但 FMX
!.
上没有这样的东西
最后我的目标是绘制一个非常大的图像(1000*16000)加载到 TBitmapSurface
上 1
TBitmap
(因为 TBitmap
不支持超过 8192px
而我的身高是 16000px
,我需要在两个 TBitmap
上画这个。
我正在使用 Delphi 10.2.3.
谢谢。
您可以将大图像(来自文件)拆分为两个 TImage
组件,如下所示
像您在代码中所做的那样,将图像从文件加载到 TBitmapSurface
。
然后创建另一个TBitmapSurface
并将其大小设置为大的一半。把大图的前半部分复制到这个surface,赋值给Image1.Bitmap
。然后将后半部分复制到这个表面并将其分配给 Image2.Bitmap
.
var
srce, dest: TBitmapSurface;
path: string;
scan: integer;
w, h1, h2: integer;
begin
path := 'C:\tmp\Imgs\res.bmp';
srce := TBitmapSurface.Create;
try
TBitmapCodecManager.LoadFromFile(path, srce);
dest := TBitmapSurface.Create;
try
// first half
w := srce.Width;
h1 := srce.Height div 2;
dest.SetSize(w, h1, TPixelFormat.RGBA);
for scan := 0 to h1-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan]^, srce.Width * 4);
Image1.Bitmap.Assign(dest);
// second half
h2 := srce.Height - h1;
dest.SetSize(w, h2, TPixelFormat.RGBA);
for scan := h1 to srce.Height-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan-h1]^, srce.Width * 4);
Image2.Bitmap.Assign(dest);
finally
dest.Free;
end;
finally
srce.Free;
end;
后续:
我需要在 FMX.Graphics.TBitmap
上绘制 TBitmapSurface
上的内容,我在网上找到了很多关于此的答案,但它们要么在 VLC
中而不是 FMX
或者他们的目标是 saving
和 loading
而不是借鉴 TBitmap
,这就是为什么我在这里问了一个新问题。
现在这是我在 TBitmapSurface
上加载图像的当前代码:
var
bitmapSurf: TBitmapSurface;
path: string;
begin
path := 'image.jpg';
bitmapSurf := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
end;
现在搜索了一下,我发现我可以在 TBitmapSurface
上使用 Scanline
,但我不知道如何使用它在 TBitmap
上绘图,网上有些人用过 TBitmap.canvas.draw
,但 FMX
!.
上没有这样的东西
最后我的目标是绘制一个非常大的图像(1000*16000)加载到 TBitmapSurface
上 1
TBitmap
(因为 TBitmap
不支持超过 8192px
而我的身高是 16000px
,我需要在两个 TBitmap
上画这个。
我正在使用 Delphi 10.2.3.
谢谢。
您可以将大图像(来自文件)拆分为两个 TImage
组件,如下所示
像您在代码中所做的那样,将图像从文件加载到 TBitmapSurface
。
然后创建另一个TBitmapSurface
并将其大小设置为大的一半。把大图的前半部分复制到这个surface,赋值给Image1.Bitmap
。然后将后半部分复制到这个表面并将其分配给 Image2.Bitmap
.
var
srce, dest: TBitmapSurface;
path: string;
scan: integer;
w, h1, h2: integer;
begin
path := 'C:\tmp\Imgs\res.bmp';
srce := TBitmapSurface.Create;
try
TBitmapCodecManager.LoadFromFile(path, srce);
dest := TBitmapSurface.Create;
try
// first half
w := srce.Width;
h1 := srce.Height div 2;
dest.SetSize(w, h1, TPixelFormat.RGBA);
for scan := 0 to h1-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan]^, srce.Width * 4);
Image1.Bitmap.Assign(dest);
// second half
h2 := srce.Height - h1;
dest.SetSize(w, h2, TPixelFormat.RGBA);
for scan := h1 to srce.Height-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan-h1]^, srce.Width * 4);
Image2.Bitmap.Assign(dest);
finally
dest.Free;
end;
finally
srce.Free;
end;