主题:[讨论]关于.NET中图形图象处理的问题,高手进
			 LostAbaddon
				 [专家分:40]  发布于 2006-12-13 13:59:00
 LostAbaddon
				 [专家分:40]  发布于 2006-12-13 13:59:00							
			我有一个程序,是用VB.NET2003写的,也做了VC#2003的版本,功能是画图和图象处理,但是功能上都做好以后才发现我忽略了几个很严重的问题,望大家能帮忙!谢谢啊!!!
1,我在程序上画完了图(是随意画的,没有预先内容),然后把程序最小化再打开,发现东西都没了!请问我应该怎么办啊?在PAINT事件中有e.Graphic,但是由于都是随意画的,也不可能把所有命令在PAINT事件中重做一遍啊。望高手帮忙。
2,我画完的图是在PICTUREBOX的CREATEGRAPHIC上的,如何保存为我们正常看到的图片?比如我想保存为BMP,JPG和GIF,有什么办法吗?望高人指点。
3,我想把CREATEGRAPHIC上的内容指定为另一个窗体的背景,应该怎么做?似乎没有从GRAPHIC转换到IMAGE或者STREAM或者BITMAP的方法啊,至少我从来没找到过。望超人协助。
						
					 
		
			
回复列表 (共7个回复)
		
								
				沙发
				
					 薛一刀 [专家分:220]  发布于 2006-12-17 18:02:00
薛一刀 [专家分:220]  发布于 2006-12-17 18:02:00				
				回答你第一个问题;
最小化再最大化以后,窗体会被重绘制
所以,在最小化的时候,比必须把你化好的层,先保存到一个全局对象里面
当最大化以后,再从那个对象里面读出图象!!
具体代码不提供
后面两个问题我也不知道。。。
							 
						
				板凳
				
					 LostAbaddon [专家分:40]  发布于 2006-12-17 18:48:00
LostAbaddon [专家分:40]  发布于 2006-12-17 18:48:00				
				能不能说得在具体一点?
比如,你所说的层是GRAPHIC吗?如何保存一个GRAPHIC到公有?又如何把一个公有GRAPHIC调回到FORM的CREATEGRAPHIC中?在PAINT事件中e.graphic为readonly的,而FORM的CREATEGRAPIC不能赋值。
所以你提供的思路我暂时无法实现。
说句题外话,绘图方面感觉.NET普遍比VS6差。6中很容易实现的功能在.NET中要大绕圈子。这是进步吗?
							 
						
				3 楼
				
					 jzyray [专家分:20610]  发布于 2006-12-17 19:45:00
jzyray [专家分:20610]  发布于 2006-12-17 19:45:00				
				先创建Bitmap,然后再利用Graphics.FromImage(该Bitmap)。
之后所有的操作就相当于在Bitmap上操作。
PictureBox.Image = 该Bitmap
就把图像放进去了
							 
						
				4 楼
				
					 LostAbaddon [专家分:40]  发布于 2006-12-17 21:32:00
LostAbaddon [专家分:40]  发布于 2006-12-17 21:32:00				
				这个,你确定吗?
我用这个方法试过,但是一点反应都没有。
用来保存图片的话图片依然是一片空白。
我不知道是不是我的方法有问题,能不能给个例子?下面是我的CODE:
Namespace Spread
    Public Class FrmMain
        Inherits System.Windows.Forms.Form
        Private DH As Graphics
        Private TB As Bitmap
#Region " Windows 窗体设计器生成的代码 "
        Public Sub New()
            MyBase.New()
            InitializeComponent()
            DH = PictureBox1.CreateGraphics
            TB = New Bitmap(PictureBox1.Width, PictureBox1.Height, Imaging.PixelFormat.Format64bppPArgb)
            DH.FromImage(TB)
        End Sub
        '窗体重写 dispose 以清理组件列表等,CODE略。
#End Region
        Private Sub FrmMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            PictureBox1.Image = TB
        End Sub
        Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
            DH.FillRectangle(New SolidBrush(Color.Green), 0, 0, 100, 100)
        End Sub
        Private Sub FrmMain_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
            TB.Save("a.bmp")
        End Sub
    End Class
End Namespace
							 
						
				5 楼
				
					 LostAbaddon [专家分:40]  发布于 2006-12-24 13:24:00
LostAbaddon [专家分:40]  发布于 2006-12-24 13:24:00				
				还是没人能回答我的问题吗?
上次的解决方案经过试验并不可行啊.
这么难道真没高手吗?
不管什么语言都可以,只要是.NET就成.
							 
						
				6 楼
				
					 jzyray [专家分:20610]  发布于 2006-12-24 19:26:00
jzyray [专家分:20610]  发布于 2006-12-24 19:26:00				
				不需要用PictureBox来CreateGraphics
直接Graphics g = Graphics.FromImage(...);
							 
						
				7 楼
				
					 LostAbaddon [专家分:40]  发布于 2006-12-25 02:07:00
LostAbaddon [专家分:40]  发布于 2006-12-25 02:07:00				
				在jzyray的提示下,问题解决了,在此感谢jzyray朋友的帮助。
不过现在遇到一个小问题:我在保存完一次图片以后想再以这个文件名保存一次图片,却出现了问题,一直显示一下错误:
未处理的“System.Runtime.InteropServices.ExternalException”类型的异常出现在 system.drawing.dll 中。
其他信息: GDI+ 中发生一般性错误。
请问这是什么原因呢?应该怎么解决啊?
再次感谢帮助我的朋友们。
							 
									
			
我来回复