Нужен метод для расчета экстентов реальных элементов чертежа в tcanvas

Я использую компонент Paintbox для рисования различных форм, используя прямоугольник, многоугольник и другие методы холста. После того, как пользователь создал рисунок, я хочу сохранить растровое изображение для использования в списке. Проблема состоит в том, что рисунок может использовать только небольшую часть холста, и результирующее изображение в списке будет очень маленьким, если я не отрегулирую его размер, выбрав только использованную часть оригинального холста Paintbox. Итак, вопрос в том, как определить, какая часть холста была использована, чтобы я мог извлечь только ту часть холста, чтобы загрузить ее в растровое изображение для отображения в списке?

(Примечание: я отредактировал выше, чтобы немного прояснить вопрос)

У самой программы есть коробка для рисования (200x200) и изображение (32 x 32). Изображение получает свое растровое изображение из коробки с помощью Bitmap1.Canvas.CopyRect(Dest, PaintBox1.Canvas, Source);, Если размер рисования в окне рисования составляет всего 20x20 в файле 200x200 paintbox.canvas, то результирующее растровое изображение в Image.canvas будет очень маленьким в 32x32 image.canvas. Мне нужно увеличить его, а это значит, что я должен определить фактический размер используемой области в коробке с красками и изменить исходный размер в "CopyRec".

1 ответ

Один из подходов, который я разработал, основан на предположении, что различные нарисованные элементы, такие как круги, прямоугольники, текст и т. Д., Размещены на нейтральном фоне. В этом случае я могу прочитать растровое изображение, используя tbitmap.scanline сравнить цвет рисунка с цветом фона и вычислить размеры рисунка в каждой строке, чтобы определить размеры рисунка в общем растровом изображении.

  TRGBTriple = packed record
    rgbtBlue: Byte;
    rgbtGreen: Byte;
    rgbtRed: Byte;
  end;
  TRGBTripleArray = ARRAY[Word] of TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray; // use a PByteArray for pf8bit color

function findBMPExtents (Bmp : tbitmap; BkgdClr : longint):trect;
// finds the extents of an image in a background or BkgdClr color
//works on 24 bit colors
var
  P : pRGBTripleArray;
  x,y : integer;
  tfound, bfound, done : boolean;
  WorkTrpl : TRGBTriple;
  WorkRect : trect;
begin
  result.top := 0;
  result.bottom := Bmp.height;
  result.left := Bmp.Width;
  result.right := 0;
  tfound := false;
  bfound := false;
  WorkTrpl := getRGB (BkgdClr);

  //find left and top
  y := 0;
  done := false;
  Repeat
    P := Bmp.ScanLine[y];
    x := 0;
    Repeat
      if (p[x].rgbtBlue <> WorkTrpl.rgbtBlue) or
         (p[x].rgbtGreen <> WorkTrpl.rgbtGreen) or
         (p[x].rgbtRed <> WorkTrpl.rgbtRed) then
        begin
          tfound := true;
          if x <= result.left then begin
            result.left := x;
            done := true;
          end;
        end;
      inc (x);
    until (x = bmp.width) or done;
    done := false;
    inc (y);
    if not tfound then
      inc(result.top);
  until (y = bmp.height);

  //find right and bottom
  y := bmp.height - 1;
  done := false;
  Repeat
    P := Bmp.ScanLine[y];
    x := bmp.width-1;
    Repeat
      if (p[x].rgbtBlue <> WorkTrpl.rgbtBlue) or
         (p[x].rgbtGreen <> WorkTrpl.rgbtGreen) or
         (p[x].rgbtRed <> WorkTrpl.rgbtRed) then
        begin
          bfound := true;
          if x >= result.right then begin
            result.right := x;
            done := true;
          end;
        end;
      dec (x);
    Until (x = 0) or done;
    if not bfound then
      dec(result.bottom);
    done := false;
    dec (y);
  Until (y = -1);
  dec(result.bottom);
end;
Другие вопросы по тегам