小周的技术博客

困难是培养伟大心志的保姆,唯有这个冷酷的保姆才会不停地推着摇篮,培养一个勇敢、刚健的孩子。 ---------布赖恩特

C#屏幕操作类

/// <summary>
    /// 屏幕操作类
    /// Add by 2017-07-25
    /// 1、屏幕生成Image 方法
    /// 2、Image按百分比压缩 方法
    /// 3、Image根据指定像素生成方法
    /// </summary>
    public class ScreenOper
    {
        [DllImport("user32.dll")]
        static extern bool GetCursorInfo(out CURSORINFO pci);

        private const Int32 CURSOR_SHOWING = 0x00000001;
        [StructLayout(LayoutKind.Sequential)]
        struct POINT
        {
            public Int32 x;
            public Int32 y;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct CURSORINFO
        {
            public Int32 cbSize;
            public Int32 flags;
            public IntPtr hCursor;
            public POINT ptScreenPos;
        }
        /// <summary>
        /// 屏幕截图方法 
        /// 1、将整个屏幕截图
        /// 2、并画出鼠标形状
        /// </summary>
        /// <returns></returns>
        public static Image ScreenToImg()
        {
            Image myimage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            Graphics g = Graphics.FromImage(myimage);
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
            CURSORINFO pci;
            pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
            GetCursorInfo(out pci);
            System.Windows.Forms.Cursor cur = new System.Windows.Forms.Cursor(pci.hCursor);
            cur.Draw(g, new Rectangle(pci.ptScreenPos.x - 10, pci.ptScreenPos.y - 10, cur.Size.Width, cur.Size.Height));
            return myimage;
        }

        /// <summary>
        /// 将图片按百分比压缩,flag取值1到100,越小压缩比越大
        /// </summary>
        /// <param name="iSource"></param>
        /// <param name="outPath"></param>
        /// <param name="flag"></param>
        /// <returns></returns>
        public static bool ImgZip(Image iSource, string outPath, int flag)
        {
            ImageFormat tFormat = iSource.RawFormat;
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageDecoders();
                ImageCodecInfo jpegICIinfo = null;

                jpegICIinfo = arrayICI.Where(c => c.FormatDescription.Equals("JPEG")).FirstOrDefault();

                if (jpegICIinfo != null)
                    iSource.Save(outPath, jpegICIinfo, ep);
                else
                    iSource.Save(outPath, tFormat);
            }
            catch
            {
                return false;
            }
            iSource.Dispose();
            return true;
        }

        /// <summary>
        /// 将图片按百分比压缩,flag取值1到100,越小压缩比越大
        /// </summary>
        /// <param name="iSource">原图片</param>
        /// <param name="flag">1-100</param>
        /// <returns></returns>
        public static Image ImgZip(Image iSource, int flag)
        {
            Image img;
            MemoryStream mStream = new MemoryStream();
            ImageFormat tFormat = iSource.RawFormat;
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageDecoders();
                ImageCodecInfo jpegICIinfo = null;
                jpegICIinfo = arrayICI.Where(c => c.FormatDescription.Equals("JPEG")).FirstOrDefault();
                if (jpegICIinfo != null)
                    iSource.Save(mStream, jpegICIinfo, ep);
                img = Image.FromStream(mStream);
                mStream.Close();
            }
            catch
            {
                return iSource;
            }
            iSource.Dispose();
            return img;
        }
        /// <summary>
        /// 将图片根据像素生成
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        public static Image SetImageSize(Image srcImage, int dWidth, int dHeight)
        {
            Image ob;
            try
            {
                //按比例缩放
                Size tem_size = new Size(srcImage.Width, srcImage.Height);
                int sW = 0, sH = 0;
                if (tem_size.Width > dHeight || tem_size.Width > dWidth)
                {
                    if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
                    {
                        sW = dWidth;
                        sH = (dWidth * tem_size.Height) / tem_size.Width;
                    }
                    else
                    {
                        sH = dHeight;
                        sW = (tem_size.Width * dHeight) / tem_size.Height;
                    }
                }
                else
                {
                    sW = tem_size.Width;
                    sH = tem_size.Height;
                }

                ob = new Bitmap(dWidth, dHeight);
                Graphics g = Graphics.FromImage(ob);
                g.Clear(Color.WhiteSmoke);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(srcImage, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, srcImage.Width, srcImage.Height, GraphicsUnit.Pixel);
                g.Dispose();
            }
            catch (Exception)
            {
                return null;
            }
            return ob;
        }
    }


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。