Como cortar um TBitmap FMX
Eu recebo um bitmap via evento TCameraComponent.SampleBufferReady. Preciso cortar a imagem recebida para obter uma imagem retangular, por exemplo.
Calculo os parâmetros necessários no seguinte método:
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;
Encontrei uma resposta por @RRUZdelphi-how-do-i-crop-a-bitmap-in-place, mas requer um identificador de API VCL e usa uma função GDI do Windows:
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;
Meu projeto está usando o FMX e pretendo portá-lo para a plataforma Android no futuro. Então, espero ter problemas se usar alças. Como posso resolver este problema?