现在在窗口开着的情况下可以保存 我想让其在窗口关闭的时候也能保存 是不是需要把图像写到内存里 请问如何做private void DrawFitnessCurve()
{
Graphics dc = Graphics.FromHwnd(this.PB.Handle); Pen CadetBluePen = new Pen(Color.CadetBlue, 2); Point[] curve = new Point[9]; curve[0].X = 58; curve[0].Y = 8;
curve[1].X = 116; curve[1].Y = 20;
curve[2].X = 174; curve[2].Y = 80;
curve[3].X = 232; curve[3].Y = 156;
curve[4].X = 290; curve[4].Y = 100;
curve[5].X = 348; curve[5].Y = 89;
curve[6].X = 406; curve[6].Y = 98;
curve[7].X = 464; curve[7].Y = 43;
curve[8].X = 522; curve[8].Y = 12; dc.DrawCurve(CadetBluePen, curve);
} private void PB_Paint(Object sender, PaintEventArgs e)
{
DrawFitnessCurve();
SaveImage();
} private void SaveImage()
{
//保存图像 Graphics g1 = this.PB.CreateGraphics(); Image MyImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height, g1); Graphics g2 = Graphics.FromImage(MyImage); IntPtr dc1 = g1.GetHdc(); IntPtr dc2 = g2.GetHdc(); BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376); g1.ReleaseHdc(dc1); g2.ReleaseHdc(dc2); MyImage.Save("test.png", ImageFormat.Png);
} [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle IntPtr hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner System.Int32 dwRop // raster operation code );
{
Graphics dc = Graphics.FromHwnd(this.PB.Handle); Pen CadetBluePen = new Pen(Color.CadetBlue, 2); Point[] curve = new Point[9]; curve[0].X = 58; curve[0].Y = 8;
curve[1].X = 116; curve[1].Y = 20;
curve[2].X = 174; curve[2].Y = 80;
curve[3].X = 232; curve[3].Y = 156;
curve[4].X = 290; curve[4].Y = 100;
curve[5].X = 348; curve[5].Y = 89;
curve[6].X = 406; curve[6].Y = 98;
curve[7].X = 464; curve[7].Y = 43;
curve[8].X = 522; curve[8].Y = 12; dc.DrawCurve(CadetBluePen, curve);
} private void PB_Paint(Object sender, PaintEventArgs e)
{
DrawFitnessCurve();
SaveImage();
} private void SaveImage()
{
//保存图像 Graphics g1 = this.PB.CreateGraphics(); Image MyImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height, g1); Graphics g2 = Graphics.FromImage(MyImage); IntPtr dc1 = g1.GetHdc(); IntPtr dc2 = g2.GetHdc(); BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376); g1.ReleaseHdc(dc1); g2.ReleaseHdc(dc2); MyImage.Save("test.png", ImageFormat.Png);
} [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle IntPtr hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner System.Int32 dwRop // raster operation code );
你首先产生一个和Picturebox或容器同样大小的Bitmap对象,然后所有的绘画操作都在这个Bitmap对象上,然后在容器的Paint事件中
先修改图,然后通过DrawImage的方法把它画到容器上,然后通过Bitmap自带的Save方法进行保存。
这一部分,你可以参看
http://www.codeproject.com/cs/media/flickerFreeDrawing.asp如果关闭窗体的时候,直接通过bitmap对象来保存。