2013-12-03 75 views
4

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

因此,我在窗体上有一个保存按钮,通过单击它可打开保存对话框。我应该如何继续保存Canvas?

+0

您也可以借鉴的TImage的帆布代替,然后保存导致TImage.Picture.Bitmap –

回答

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; 
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等

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; 
+0

它通常优选解决方案的一些解释和回答自成体系。 – Brick