我正在使用Delphi XE2编写程序.我在画布上画了一些线条和形状.我想使用保存对话框将Canvas保存为图像文件.
所以我在表单上有一个保存按钮,通过单击它,它会打开保存对话框.我该如何继续保存画布?
Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)
我们需要做一些重新分解.我们需要将绘制代码提取到单独的方法中.将该方法传递给画布,使其与绘制的画布无关.
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;
Run Code Online (Sandbox Code Playgroud)
我们现在回到了我们开始的地方,但准备好迎接真正的目标.让我们编写一个绘制到位图的函数,然后保存到文件中:
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;
Run Code Online (Sandbox Code Playgroud)
这自然可以扩展到其他图像类型,如GIF,PNG,JPEG等.
我这样做了(使用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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14605 次 |
| 最近记录: |