Почему при вырезании части изображения выходное изображение получается искаженным?

Рейтинг: 0Ответов: 1Опубликовано: 05.05.2023

Программа под смартфон. На форме лежит Layout, на нем Image На картинке, посредине лежит Rectangle. Когда я пытаюсь вырезать из картинки участок ограниченный Rectangle, выходное изображение не соответствует границам и имеет искаженный масштаб. Ка можно привести это в норму?

var
  bmpS, bmpD: TBitMap;
  iRectS: Trectf;
  HD, wD: integer;
  iRectD: Trectf;
   Scalex, scaley: real;
begin
  Scalex := 1;
  scaley := 1;
  bmpS := imgCameraView.Bitmap;
  iRectS := Trectf.Create(TPointF.Create(Ramka.Position.X * Scalex,
    Ramka.Position.Y * scaley), TPointF.Create((Ramka.Position.X + Ramka.Width)
    * Scalex, (Ramka.Position.Y + Ramka.Height) * scaley));

  wD := Max(0, Round(Ramka.Width));
  HD := Max(0, Round(Ramka.Height));

  bmpD := TBitMap.Create(wD, HD);
  iRectD := Trectf.Create(0, 0, Ramka.Width, Ramka.Height);
  Code.Visible := True;

  if bmpD.Canvas.BeginScene then
    try
      bmpD.Canvas.DrawBitmap(bmpS, iRectS, iRectD, 1);
      bmpD.Canvas.EndScene;
      Code.Bitmap.assign(bmpD);
     finally
      bmpD.Free;
 
    end;

Ответы

▲ 0

Вероятно, потому что само изображение с камеры не такого же размера, как экран. Попробуйте пересчитать прямоугольник вырезки в доли от экрана, а потом пересчитать это в координаты картинки. Например:

  • Картинка 2000х1500
  • Экран 1000х800
  • Прямоугольник на экране 150:150:800:600
  • Относительный прямоугольник тогда будет 0,15:0,1875:0,8:0,75
  • Прямоугольник для вырезки тогда будет 300:281:1600:1125