关于Canvas保存的问题(300分)

  • 主题发起人 主题发起人 victorfjb
  • 开始时间 开始时间
V

victorfjb

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个Form的Canvas上画了一些图形,图形显示时有滚动条,现想把画出的图形保存为图片,保存的时候,Bmp中只有Form中可见部分,需要拖动滚动条才显示的部分无法写到bmp文件中,有没有什么好的解决办法呢?是不是我的思路有问题?
期盼高手指点。
如果能告知Canvas到BMP或者JPG的方法最好
 
问题: 如何把Canvas的数据保存为一个BMP文件 ( 积分: 100 )
分类: 图形图象

来自: erace99, 时间: 2003-11-10 16:06:00, ID: 2284386
比如说有一个TCustomControl控件,而且其Height超过屏幕的高度,请问如何可以保存其Canvas上的内容

来自: Tassadar, 时间: 2003-11-10 17:21:00, ID: 2284720
创建一个TBitmap对象然后用CopyRect方法,最后SaveToFile

来自: erace99, 时间: 2003-11-10 17:25:00, ID: 2284746
这样是不可以的,我试过,用CopyRect只能应用于在界面上可视的

来自: hjybh, 时间: 2003-11-10 17:34:00, ID: 2284780
BitBlt(Image_Back.canvas.handle,0,0,Image_Back.width,Image_Back.height,TempImage.canvas.handle,0,0,srccopy);
Image_Back.canvas.SaveToFile('*.bmp');

来自: yu_ting, 时间: 2003-11-10 17:35:00, ID: 2284783
学习

来自: erace99, 时间: 2003-11-10 17:47:00, ID: 2284815
用BitBlt也没有用啊,我试过啦,这些都只能是屏幕上能够显示的

来自: Tassadar, 时间: 2003-11-10 18:24:00, ID: 2284910
看看这段代码吧,绝对可以
with TBitmap.Create do
begin
try
Width := Memo1.Width;
Height := Memo1.Height;
Memo1.PaintTo(Canvas, 0, 0);
SaveToFile('C:/Documents and Settings/Administrator/桌面/test.bmp');
finally
Free;
end;
end;

来自: erace99, 时间: 2003-11-11 9:33:00, ID: 2285717
用Memo.PaintTo和用Bitblt以及CopyRect的效果都是一样的,都不能绘制出不可见的部分,只能绘制出当前在屏幕上可见的部分

来自: Tassadar, 时间: 2003-11-11 14:28:00, ID: 2286586
你要试过才好说话,PaintTo和CopyRect完全是两回事

来自: erace99, 时间: 2003-11-25 10:45:00, ID: 2315246
多人接受答案了。

得分大富翁: hjybh-33,Tassadar-33,yu_ting-34,
 
唉,别这样贴吧,
使用链接,或者把真正解决问题的内容有选择性的粘贴出来。
 
其实非常简单,你只要将要画的信息先画在一个位图上,然后根据需要将位图的一部分或全部拷贝到Form上就可以了,保存的时候只是简单的Bitmap.SaveToFile('C:/Bitmap'),其实这就是双缓冲的实现。即达到了你的要求,当图像较复杂或较大的时候,还可以提高翻转的效率。
 
感谢楼上的各位,由于要对所画的图形进行一系列的编辑操作,在Form上控制就比较容易,画到Image上很多事件都不能触发,而且放大缩小的时候图像会闪烁,所以我现在是将图形画在Form上,在这种情况下有没有办法可以将全图保存为BMP或者JPG?
 
Canvas转换为bitmap
 
你还是,继承一个类重新做吧,不要老想着用组件里的方法,有些组件实在是让人寒心。
如:Image用画布的时候闪烁的厉害,而用Form图像浏览又有问题。
还是自己老老实实的做一个组件或类来做吧。
 
确实,如果画在Form上,不可见部分不能保存到文件中,因为Canvas不能保存所画的图像。
我现在采取的是一个中转的办法,先在Form上编辑好要编辑的图形信息,然后再重新画到Image上,然后存为图形JPG文件。但是还是觉得有点麻烦。
to草原骏马,你说的方法我不会:(虽然用过CB多年,但是还从来没有自己做过组件,用类实现还没想到好的办法。。。
 
赞同appfirst的
 
其实先画到位图上,与画在FORM上是一样的,只不过是做个坐标转换而已。
 
你从帮助里面查一查这个函数:GetFormImage,我记不清了,或者是FormImage,其作用是得到Form所有的东西的图像,这个函数返回值类型是TBitmap。
例如:
aBmp : Tbitmap;
aBmp := Tbitmap.Create();
aBmp := GetFormImage();
 
kerbcurb,对于form上不可见部分是否包含在这个Image中呢?我还没来得及尝试
 
后退
顶部