Delphi 7, как скопировать содержимое Paintbox в Tbitmap? - PullRequest
4 голосов
/ 19 января 2012

я работаю над delphi 7 , и я хочу, как скопировать / назначить содержимое TpaintBox в Tbitmap?

как это

 public
  { Public declarations }
   BitMap     : TBitmap;
 end;

У меня есть Tbitmap, объявленный как public, и я создаю его на ForformCreate, как это

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      BitMap     := TBitMap.Create;
      end;

Затем я что-то рисую на растровом изображении, как это

      procedure TForm1.DrawOnPainBox;
        begin
         If BitMap.Width  <> PaintBox1.Width  then BitMap.Width  := PaintBox1.Width;
         If BitMap.Height <> PaintBox1.Height then BitMap.Height := PaintBox1.Height;
         BitMap.Canvas.Rectangle(0,0,random(PaintBox1.Width ),random(PaintBox1.Height));
         PaintBox1.Canvas.Draw(0,0,BitMap);
        end;

с помощью PaintBox1.Canvas.Draw(0,0,BitMap); мы можем отобразить, что есть в растровом изображении, в ящик для рисования, но каков обратный путь?

как назначить / скопировать содержимое палитры в растровое изображение?

 `BitMap:=PaintBox1.Canvas.Brush.Bitmap;` 

это компилируется, но если я делаю это и снова вызываю procedure TForm1.DrawOnPainBox;, я получаю access Violation, и отладчик показывает bitmap и PaintBox1.Canvas.Brush.Bitmap, даже если на paintBox

нарисованы некоторые линии

enter image description here

enter image description here

Ответы [ 2 ]

10 голосов
/ 19 января 2012

Чтобы присвоить содержимое TPaintBox (назовем его PaintBox1) TBitmap (скажем, Bitmap), вы можете сделать

Bitmap.Width := PaintBox1.Width;
Bitmap.Height := PaintBox1.Height;
BitBlt(Bitmap.Canvas.Handle,
  0,
  0,
  Bitmap.Width,
  Bitmap.Height,
  PaintBox1.Canvas.Handle,
  0,
  0,
  SRCCOPY);

Примечание: В более новых версиях Delphi вы можете использовать Bitmap.SetSize вместо Bitmap.Width и Bitmap.Height.

1 голос
/ 20 мая 2013

TBitmap.setsize был представлен в Delphi 2006, возможно, вы используете более старую версию.Просто замените Bitmap.SetSize (X, Y)

на

Bitmap.Width := X
Bitmap.Height := Y

, это медленнее (но это имеет значение, только если вы используете его в цикле), но вы скомпилируете код

, еслиэто случается слишком часто, объявляйте новый модуль BitmapSize.pas:

unit BitmapSize;

interface

uses
    graphics;

Type
    TBitmapSize = class (TBitmap)
    public
        procedure Setsize (X, Y : integer);
    end;



implementation

procedure TBitmapsize.Setsize(X, Y: integer);
begin
    Width := X;    // may need some more tests here (X > 0, Y > 0, ...)
    Height := Y;
end;

end.

, затем заменяйте в объявлении и создании вашего точечного рисунка TBitmap на TBitmapSize.

..
Var
  B : TBitmapSize;
..
  B := TBitmapSize.Create;
...