首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何裁剪FMX TBitmap

如何裁剪FMX TBitmap
EN

Stack Overflow用户
提问于 2015-07-01 11:18:36
回答 1查看 3.2K关注 0票数 2

我通过TCameraComponent.SampleBufferReady事件接收位图。然后,我需要裁剪收到的图像,以便我得到一个,例如,直角图像。

我用以下方法计算必要的参数:

代码语言:javascript
复制
procedure TPersonalF.SampleBufferReady(Sender: TObject;
  const ATime: TMediaTime);
var
  BMP: TBitmap;
  X, Y, W, H: Word;
begin
  Try
    BMP := TBitmap.Create;
    CameraComponent.SampleBufferToBitmap(BMP, true);
    if BMP.Width >= BMP.Height then //landscape
    begin
      W:=BMP.Height;
      H:=W;
      Y:=0;
      X:=trunc((BMP.Width-BMP.Height)/2);
    end
    else //portrait
    begin
      W:=BMP.Width;
      H:=W;
      X:=0;
      Y:=trunc((BMP.Height-BMP.Width)/2);
    end;
    CropBitmap(BMP, Image1.Bitmap, X,Y,W,H);
  Finally
    BMP.Free;
  End;
end; 

我找到了@RRUZ delphi-how-do-i-crop-a-bitmap-in-place的答案,但它需要一个VCL句柄,并且使用Windows函数:

代码语言:javascript
复制
procedure CropBitmap(InBitmap, OutBitMap: TBitmap; X, Y, W, H: Word);
  begin
    OutBitMap.PixelFormat := InBitmap.PixelFormat;
    OutBitMap.Width := W;
    OutBitMap.Height := H;
    BitBlt(OutBitMap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X,
      Y, SRCCOPY);
  end;

我的项目是使用FMX,我计划在未来将其移植到Android平台。所以,如果我使用句柄,我就会遇到问题。我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-01 15:26:06

假设您可以保证InBitmap和OutBitMap的存在(如果没有,您可以自己处理错误检查)

代码语言:javascript
复制
procedure CropBitmap(InBitmap, OutBitMap: TBitmap; X, Y, W, H: Word);
var
  iRect : TRect;
begin
    OutBitMap.PixelFormat := InBitmap.PixelFormat;
    OutBitMap.Width := W;
    OutBitMap.Height := H;
    iRec.Left := 0;
    iRect.Top := 0;
    iRect.Width := W;
    iRect.Height := H;
    OutBitMap.CopyFromBitmap( InBitMap, iRect, 0, 0 );
end;

它与原始版本相同,但使用了Firemonkey,它类似于CopyFromBitmap,非常神秘地命名为BitBlt。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31159795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档