【问题标题】:How to draw FMX.Surface.TBitmapSurface on FMX.Graphics.TBitmap如何在 FMX.Graphics.TBitmap 上绘制 FMX.Surface.TBitmapSurface
【发布时间】:2018-07-25 16:04:28
【问题描述】:

继续:
How to load large bitmap in FMX (fire monkey)
我需要在FMX.Graphics.TBitmap 上绘制TBitmapSurface 上的内容,我在网上找到了很多关于此的答案,但它们要么在VLC 而不是FMX,要么他们的目标是@ 987654326@ 和 loading 而不是在 TBitmap 上绘图,这就是为什么我在这里提出一个新问题。
现在这是我在TBitmapSurface 上加载图像的当前代码:

var
  bitmapSurf: TBitmapSurface;
  path: string;
begin
  path := 'image.jpg';
  bitmapSurf := TBitmapSurface.Create;
  TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
end;

现在搜索了一下发现可以在TBitmapSurface上用Scanline,但是我不知道怎么用它在TBitmap上画画,网上有人用过@ 987654334@,但是FMX上不存在这样的东西!。
最后我的目标是绘制一个非常大的图像(1000 * 16000),它加载在TBitmapSurface上超过1 TBitmap(因为TBitmap 不支持超过8192px 而我的身高是16000px,我需要在两个TBitmap 上画这个)。
我正在使用 Delphi 10.2.3。
谢谢。

【问题讨论】:

    标签: delphi canvas bitmap firemonkey


    【解决方案1】:

    您可以将大图像(从一个文件)拆分为两个TImage 组件,如下所示

    将图像从文件加载到TBitmapSurface,就像您在代码中所做的那样。

    然后创建另一个TBitmapSurface 并将其大小设置为大的一半。将大图像的前半部分复制到此表面并将其分配给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;
    

    【讨论】:

    • 谢谢您,出色的答案!,一切正常。
    • 不客气,很高兴能帮上忙。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多