将画布保存为图像

时间:2013-12-03 18:54:08

标签: delphi delphi-xe2

我正在使用Delphi XE2编写程序。我在画布上画了一些线条和形状。我想使用保存对话框将Canvas保存为图像文件。

所以我在表单上有一个保存按钮,通过单击它,它会打开保存对话框。我该如何继续保存画布?

3 个答案:

答案 0 :(得分:10)

目前,您很可能在OnPaint事件的TPaintBox或表单本身中拥有代码。该代码可能如下所示:

procedure TMyForm.PaintBox1Paint(Sender: TObject);
begin
  with PaintBox1.Canvas do
  begin
    MoveTo(0, 0);
    LineTo(42, 666);
    // and so on.
  end;
end;

我们需要做一些重新分解。我们需要将绘制代码提取到单独的方法中。将该方法传递给画布,使其与绘制的画布无关。

procedure TMyForm.PaintToCanvas(Canvas: TCanvas);
begin
  with Canvas do
  begin
    MoveTo(0, 0);
    LineTo(42, 666);
    // and so on.
  end;
end;

procedure TMyForm.PaintBox1Paint(Sender: TObject);
begin
  PaintToCanvas(PaintBox1.Canvas);
end;

我们现在回到了我们开始的地方,但准备好迎接真正的目标。让我们编写一个绘制到位图的函数,然后保存到文件中:

procedure TMyForm.PaintToFile(const FileName: string);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.SetSize(Paintbox1.Width, Paintbox1.Height);
    PaintToCanvas(Bitmap.Canvas);
    Bitmap.SaveToFile(FileName);
  finally
    Bitmap.Free;
  end;
end;

这自然可以扩展到其他图像类型,如GIF,PNG,JPEG等。

答案 1 :(得分:6)

我这样做了(使用VCL)。您必须正确设置SaveDialog(让用户选择有效的图像文件类型等),但您应该能够自己设置。显然你可以用TJpegImge替换TPngImage /直接将它保存为BMP或诸如此类的东西,也许你想允许多个图像扩展并根据SaveDialog的用户输入使用适当的图像扩展。

procedure TForm2.Button1Click(Sender: TObject);
  var Bmp: TBitmap;
      Png: TPngImage;
begin
  if SaveDialog1.Execute then
  begin
    Bmp := TBitmap.Create;
    try
      Bmp.SetSize(Canvas.ClipRect.Right, Canvas.ClipRect.Bottom);
      BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
      Png := TPngImage.Create;
      try
        Png.Assign(Bmp);
        Png.SaveToFile(SaveDialog1.FileName + '.png');
      finally
        Png.Free;
      end;
    finally
      Bmp.Free;
    end;
  end;
end;

答案 2 :(得分:0)

DNR:概括一点你的代码,我们有

uses Vcl.Imaging.pngimage

procedure TfrmPrincipalTest.PrintCanvas(aCanvas: TCanvas; aRect: TRect);
  var Bmp: TBitmap;
      Png: TPngImage;
begin
  if sSaveDialog1.Execute then
  begin
    Bmp := TBitmap.Create;
    try
      Bmp.SetSize(aCanvas.ClipRect.Right, aCanvas.ClipRect.Bottom);
      BitBlt(Bmp.Canvas.Handle, aRect.Top, aRect.Left, aRect.Right, aRect.Bottom, aCanvas.Handle, 0, 0, SRCCOPY);
      Png := TPngImage.Create;
      try
        Png.Assign(Bmp);
        Png.SaveToFile(sSaveDialog1.FileName + '.png');
      finally
        Png.Free;
      end;
    finally
      Bmp.Free;
    end;
  end;
end;

procedure TfrmPrincipalTest.I1Click(Sender: TObject);
var vRect: TRect;
begin
   vRect.Top:=0;
   vRect.Left:=0;
   vRect.Right:=sPageControl1.Width;
   vRect.Bottom:=sPageControl1.Height;
   PrintCanvas(sPageControl1.Canvas, vRect);
end;