• c# winform实现截图并保持图片功能


           最近项目需要对界面进行截图并保存的功能,在网上搜索了下结合实际需求最终完成功能,代码如下

       //调用导图

       private void pictureBox4_Click(object sender, EventArgs e)
            {

                Bitmap bitmap = new Bitmap(this.Width, this.Height);
                DrawToBitmap(this, bitmap, new Rectangle(0, 0, this.Width, this.Height));

                bool isSave = true;
                SaveFileDialog saveImageDialog = new SaveFileDialog();
                saveImageDialog.Title = "图片保存";
                saveImageDialog.Filter = @"jpeg|*.jpg|bmp|*.bmp|gif|*.gif";
                if (saveImageDialog.ShowDialog() == DialogResult.OK)
                {
                    string fileName = saveImageDialog.FileName.ToString();
                    if (fileName != "" && fileName != null)
                    {
                        string fileExtName = fileName.Substring(fileName.LastIndexOf(".") + 1).ToString();
                        System.Drawing.Imaging.ImageFormat imgformat = null;
                        if (fileExtName != "")
                        {
                            switch (fileExtName)
                            {
                                case "jpg":
                                    imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                    break;
                                case "bmp":
                                    imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                                    break;
                                case "gif":
                                    imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                                    break;
                                default:
                                    MessageBox.Show("只能存取为: jpg,bmp,gif 格式");
                                    isSave = false;
                                    break;
                            }

                        }
                        //默认保存为JPG格式  
                        if (imgformat == null)
                        {
                            imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                        }
                        if (isSave)
                        {
                            try
                            {
                                images.Save(fileName, imgformat);
                                //MessageBox.Show("图片已经成功保存!");  
                            }
                            catch
                            {
                                MessageBox.Show("保存失败,你还没有截取过图片或已经清空图片!");
                            }
                        }
                    }
                }

            }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);

            [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
            public static extern bool BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);

            /// <summary>
            /// 支持呈现到指定的位图。
            /// </summary>
            public static Bitmap DrawToBitmap(Control control, Bitmap bitmap, Rectangle targetBounds)
            {
                if (bitmap == null)
                {
                    throw new ArgumentNullException("bitmap");
                }
                if (((targetBounds.Width <= 0) || (targetBounds.Height <= 0)) || ((targetBounds.X < 0) || (targetBounds.Y < 0)))
                {
                    throw new ArgumentException("targetBounds");
                }
                Bitmap image = new Bitmap(control.Width, control.Height, bitmap.PixelFormat);
                using (Graphics graphics = Graphics.FromImage(image))
                {
                    IntPtr hdc = graphics.GetHdc();
                    SendMessage(new HandleRef(control, control.Handle), 0x317, hdc, (IntPtr)30);
                    using (Graphics graphics2 = Graphics.FromImage(bitmap))
                    {
                        IntPtr handle = graphics2.GetHdc();
                        BitBlt(new HandleRef(graphics2, handle), 0, 0, control.Width, control.Height, new HandleRef(graphics, hdc), targetBounds.X, targetBounds.Y,

    0xcc0020);
                        graphics2.ReleaseHdcInternal(handle);
                    }
                    graphics.ReleaseHdcInternal(hdc);
                }
                return image;
            }

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    win8 开发之旅(1) 连连看游戏开发 前奏
    win8 开发之旅(2) 连连看游戏开发 项目错误的总结
    常见的排序算法五——堆排序
    我与mongodb 二三事(1)
    常见的排序算法四——直接选择排序
    我与mongodb 二三事(2)
    oracleHelper的使用
    公司A、公司B、公司C……
    javascript调用C#后台程序执行查询
    通过翻译学英语
  • 原文地址:https://www.cnblogs.com/newstart/p/2662474.html
Copyright © 2020-2023  润新知