想利用一个按钮
实现对form中的局部区域进行截图,加以保存
请问该如何实现呢?

解决方案 »

  1.   

    参考
    http://www.wangqi.com/html/2007-01/9392.htm
      

  2.   


    void button1_Click(object sender, EventArg e)
    {
       Rectangle roi = new Rectangle(0, 0, 300, 200);   using( Bitmap bmp = new Bitmap(roi.Width,roi.Height))
       using(Graphics g = Graphics.FromImage(bmp))
       {
           g.CopyFromScreen( this.PointToScreen( roi.Location), Point.Empty, roi.Size );
           bmp.Save(@"c:\temp\dump.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
       }
    }
      

  3.   

    SaveFileDialog SaveFileDialog1 = new SaveFileDialog();            SaveFileDialog1.Filter = "图像(*.bmp)|*.bmp";//文件筛选器
                SaveFileDialog1.AddExtension = true;//保存文件时自动加扩展名
                SaveFileDialog1.RestoreDirectory = true;
     
                Rectangle roi = new Rectangle(0, 0, 600, 400);            using (Bitmap bmp = new Bitmap(roi.Width, roi.Height))
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.CopyFromScreen(this.PointToScreen(roi.Location), Point.Empty, roi.Size);
                    bmp.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                }bmp.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)这句出错,想自己选择目录进行保存,那应该怎么改呢?
      

  4.   


            SaveFileDialog SaveFileDialog1 = new SaveFileDialog();        SaveFileDialog1.Filter = "图像(*.bmp)|*.bmp";//文件筛选器
            SaveFileDialog1.AddExtension = true;//保存文件时自动加扩展名
            SaveFileDialog1.RestoreDirectory = true;        if (SaveFileDialog1.ShowDialog() != DialogResult.OK) return;          //<--- 加这一句,显示选择目录对话框        Rectangle roi = new Rectangle(0, 0, 600, 400);
            //......
      

  5.   

    谢谢楼上的,能实现了
    但是出现了个问题
    就是这么加上之后
    保存的图像不是只针对form的
    图像中还出现了选择目录对话框的身影,
    怎么变成针对整个屏幕截图了
      

  6.   

    呵呵,你最简单的实现private screenPic( int left ,int top,int Width,int Height,string filepath)
    {
    Rectangle roi = new Rectangle(left,top,Width,Height);   using( Bitmap bmp = new Bitmap(roi.Width,roi.Height))
       using(Graphics g = Graphics.FromImage(bmp))
       {
           g.CopyFromScreen( this.PointToScreen( roi.Location), Point.Empty, roi.Size );
           bmp.Save(filepath,System.Drawing.Imaging.ImageFormat.Jpeg);
       }
    }然后你从主程序中选择好了文件路径后直接调用好了.
      

  7.   

    请问是这样吗?
    SaveFileDialog SaveFileDialog2 = new SaveFileDialog();
    SaveFileDialog2.Filter = "图像(*.bmp)|*.bmp";//文件筛选器
    SaveFileDialog2.AddExtension = true;//保存文件时自动加扩展名
    SaveFileDialog2.RestoreDirectory = true;
    if (SaveFileDialog2.ShowDialog() != DialogResult.OK)
    {
    screenPic(0, 0, 850, 600, SaveFileDialog2.FileName);
    }但是怎么保存不了
                
      

  8.   

    :-) 你换一下次序,等截图了再提示保存不就可以了吗?
        private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
            SaveFileDialog1.Filter = "图像(*.bmp)|*.bmp";//文件筛选器
            SaveFileDialog1.AddExtension = true;//保存文件时自动加扩展名
            SaveFileDialog1.RestoreDirectory = true;        Rectangle roi = new Rectangle(0, 0, 600, 400);        using (Bitmap bmp = new Bitmap(roi.Width, roi.Height))
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.CopyFromScreen(this.PointToScreen(roi.Location), Point.Empty, roi.Size);            if( SaveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    bmp.Save(SaveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
        }
      

  9.   

    正好写“大家来找茬”作弊器的时候用过截图,下面代码是截整个FORM的代码,你可以自己改一下
    public class Api
        {
            [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
            private static extern bool BitBlt(
                IntPtr hdcDest, // 目标 DC的句柄 
                int nXDest,
                int nYDest,
                int nWidth,
                int nHeight,
                IntPtr hdcSrc, // 源DC的句柄 
                int nXSrc,
                int nYSrc,
                System.Int32 dwRop // 光栅的处理数值 
                );public void SavePic()
    {
                //获得当前窗体的大小 
                Rectangle rect = this.ClientRectangle;
                //创建一个以当前屏幕为模板的图象 
                Graphics g1 = this.CreateGraphics();
                //创建以此为大小的标准位图 
                Image MyImage = new Bitmap(rect.Width, rect.Height, g1);
                Graphics g2 = Graphics.FromImage(MyImage);
                //得到屏幕的DC 
                IntPtr dc1 = g1.GetHdc();
                //得到Bitmap的DC 
                IntPtr dc2 = g2.GetHdc();
                //调用此API函数,实现屏幕捕获 
                BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376);
                //释放掉屏幕的DC 
                g1.ReleaseHdc(dc1);
                //释放掉Bitmap的DC 
                g2.ReleaseHdc(dc2);
                //以JPG文件格式来保存 
                 MyImage.Save("C:\\Capture.jpg", ImageFormat.Jpeg); //保存至C盘
                MessageBox.Show("当前屏幕已经保存为当前目录的capture.jpg文件!");
                g1.DrawImage(MyImage, this.ClientRectangle);//在窗体上画出被捕获的图片
    }
      

  10.   


    2个问题:
    1/ private void screenPic( int left ,int top,int Width,int Height,string filepath) 
    估计你调试时已经加上了.
    2/if (SaveFileDialog2.ShowDialog() == DialogResult.OK)
    当然要点击确定才能进入到函数中啊,!=的话就不执行当然保存不了了啊.代码测试能行.