• 技术文章 >后端开发 >C#.Net教程

    C# 实现QQ式截图功能实例代码详细介绍

    黄舟黄舟2017-03-07 10:50:58原创1042

    本篇文章主要介绍了C# 实现QQ式截图功能实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    这个功能一共有两部分组成,第一部分是窗体代码,另外的一部分是一个辅助方法。直接贴出代码,以供大家参考:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    using ImageClassLib;
    namespace ImageShear
    {
      public partial class Demo: Form
      {
        public Demo()
        {
          InitializeComponent();
        }
        #region 点击打开图像
        public string strHeadImagePath; //打开图片的路径
        Bitmap Bi; //定义位图对像
        private void button1_Click(object sender, EventArgs e)
        {
          openFileDialog1.Filter = "*.gif|*.jpg|*.JPEG|*.JPEG|*.bmp|*.bmp";     //设置读取图片类型
          if (openFileDialog1.ShowDialog() == DialogResult.OK)
          {
            try
            {
              strHeadImagePath = openFileDialog1.FileName;
              //this.Show(strHeadImagePath);
              Bi = new Bitmap(strHeadImagePath); //使用打开的图片路径创建位图对像
              ImageCut1 IC = new ImageCut1(40, 112, this.pictureBox1.Width, this.pictureBox1.Height);   //实例化ImageCut类,四个参数据分别表示为:x、y、width、heigth,(40、112)表示pictureBox1的Lcation的坐标,(120、144)表示pictureBox1控件的宽度和高度
              this.pictureBox1.Image = IC.KiCut1((Bitmap)(this.GetSelectImage(this.pictureBox1.Width, this.pictureBox1.Height)));   //(120、144)表示pictureBox1控件的宽度和高度
              //this.pictureBox1.Image = (this.GetSelectImage(120, 144));
            }
            catch (Exception ex)
            {
              MessageBox.Show("格式不对");
              ex.ToString();
            }
          }
        }
        #endregion
        #region 定义显示图像方法,即将打开的图像在pictureBox1控件显示
        public void Show(string strHeadImagePath)
        {
          this.pictureBox1.Load(@strHeadImagePath);  //
        }
        #endregion
        #region 获取图像
        /// <summary>
        /// 获取指定宽度和高度的图像即使图片和pictureBox1控件一样宽和高,返回值为图片Image
        /// </summary>
        /// <param name="Width表示宽"></param>
        /// <param name="Height表示高"></param>
        /// <returns></returns>
        public Image GetSelectImage(int Width, int Height)
        {
          //Image initImage = this.pictureBox1.Image;
          Image initImage = Bi;
          //原图宽高均小于模版,不作处理,直接保存 
          if (initImage.Width <= Width && initImage.Height <= Height)
          {
            //initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            return initImage;
          }
          else
          {
            //原始图片的宽、高 
            int initWidth = initImage.Width;
            int initHeight = initImage.Height;
    
            //非正方型先裁剪为正方型 
            if (initWidth != initHeight)
            {
              //截图对象 
              System.Drawing.Image pickedImage = null;
              System.Drawing.Graphics pickedG = null;
    
              //宽大于高的横图 
              if (initWidth > initHeight)
              {
                //对象实例化 
                pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                //设置质量 
                pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //定位 
                Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                //画图 
                pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                //重置宽 
                initWidth = initHeight;
              }
              //高大于宽的竖图 
              else
              {
                //对象实例化
                pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                //设置质量 
                pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //定位 
                Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
                //画图 
                pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                //重置高 
                initHeight = initWidth;
              }
    
              initImage = (System.Drawing.Image)pickedImage.Clone();
              //        //释放截图资源 
              pickedG.Dispose();
              pickedImage.Dispose();
            }
    
            return initImage;
          }
        }
        #endregion
        #region 点击button2按钮事件
        private void button2_Click(object sender, EventArgs e)
        {
          this.label1.Text = "裁剪后的图片宽度:"+this.pictureBox2.Width.ToString();
          this.label2.Text = "裁剪后的图片高度:"+this.pictureBox2.Height.ToString();
        }
        #endregion
        #region 缩放、裁剪图像用到的变量
        /// <summary>
        /// 
        /// </summary>
        int x1;   //鼠标按下时横坐标
        int y1;   //鼠标按下时纵坐标
        int width; //所打开的图像的宽
        int heigth; //所打开的图像的高
        bool HeadImageBool = false;  // 此布尔变量用来判断pictureBox1控件是否有图片
        #endregion
        #region 画矩形使用到的变量
        Point p1;  //定义鼠标按下时的坐标点
        Point p2;  //定义移动鼠标时的坐标点
        Point p3;  //定义松开鼠标时的坐标点
        #endregion
        #region 鼠标按下时发生的事件
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
          this.Cursor = Cursors.Cross;
          this.p1 = new Point(e.X, e.Y);
          x1 = e.X;
          y1 = e.Y;
          if (this.pictureBox1.Image != null)
          {
            HeadImageBool = true;
          }
          else
          {
            HeadImageBool = false;
          }
        }
        #endregion
        #region 移动鼠标发生的事件
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
          if (this.Cursor == Cursors.Cross)
          {
            this.p2 = new Point(e.X, e.Y);
            if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) > 0)   //当鼠标从左上角向开始移动时P3坐标
            {
              this.p3 = new Point(p1.X, p1.Y);
            }
            if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) > 0)   //当鼠标从右上角向左下方向开始移动时P3坐标
            {
              this.p3 = new Point(p2.X, p1.Y);
            }
            if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) < 0)   //当鼠标从左下角向上开始移动时P3坐标
            {
              this.p3 = new Point(p1.X, p2.Y);
            }
            if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) < 0)   //当鼠标从右下角向左方向上开始移动时P3坐标
            {
              this.p3 = new Point(p2.X, p2.Y);
            }
            this.pictureBox1.Invalidate(); //使控件的整个图面无效,并导致重绘控件
          }
        }
        #endregion
        #region 松开鼠标发生的事件,实例化ImageCut1类对像
        ImageCut1 IC1; //定义所画矩形的图像对像
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          if (HeadImageBool)
          {
            width = this.pictureBox1.Image.Width;
            heigth = this.pictureBox1.Image.Height;
            if ((e.X - x1) > 0 && (e.Y - y1) > 0)  //当鼠标从左上角向右下方向开始移动时发生
            {
              IC1 = new ImageCut1(x1, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));  //实例化ImageCut1类
            }
            if ((e.X - x1) < 0 && (e.Y - y1) > 0)  //当鼠标从右上角向左下方向开始移动时发生
            {
              IC1 = new ImageCut1(e.X, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));  //实例化ImageCut1类
            }
            if ((e.X - x1) > 0 && (e.Y - y1) < 0)  //当鼠标从左下角向右上方向开始移动时发生
            {
              IC1 = new ImageCut1(x1, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));  //实例化ImageCut1类
            }
            if ((e.X - x1) < 0 && (e.Y - y1) < 0)  //当鼠标从右下角向左上方向开始移动时发生
            {
              IC1 = new ImageCut1(e.X, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));   //实例化ImageCut1类
            }
            this.pictureBox2.Width = (IC1.KiCut1((Bitmap)(this.pictureBox1.Image))).Width;
            this.pictureBox2.Height = (IC1.KiCut1((Bitmap)(this.pictureBox1.Image))).Height;
            this.pictureBox2.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
            this.Cursor = Cursors.Default;
          }
          else
          {
            this.Cursor = Cursors.Default;
          }
        }
        #endregion
        #region 获取所选矩形图像
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Width"></param>
        /// <param name="Height"></param>
        /// <returns></returns>
        public Image GetSelectImage1(int Width, int Height)
        {
          Image initImage = this.pictureBox1.Image;
          //Image initImage = Bi;
          //原图宽高均小于模版,不作处理,直接保存 
          if (initImage.Width <= Width && initImage.Height <= Height)
          {
            //initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            return initImage;
          }
          else
          {
            //原始图片的宽、高 
            int initWidth = initImage.Width;
            int initHeight = initImage.Height;
    
            //非正方型先裁剪为正方型 
            if (initWidth != initHeight)
            {
              //截图对象 
              System.Drawing.Image pickedImage = null;
              System.Drawing.Graphics pickedG = null;
    
              //宽大于高的横图 
              if (initWidth > initHeight)
              {
                //对象实例化 
                pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                //设置质量 
                pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //定位 
                Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                //画图 
                pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                //重置宽 
                initWidth = initHeight;
              }
              //高大于宽的竖图 
              else
              {
                //对象实例化
                pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                //设置质量 
                pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //定位 
                Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
                //画图 
                pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                //重置高 
                initHeight = initWidth;
              }
    
              initImage = (System.Drawing.Image)pickedImage.Clone();
              //        //释放截图资源 
              pickedG.Dispose();
              pickedImage.Dispose();
            }
    
            return initImage;
          }
        }
        #endregion
        #region 重新绘制pictureBox1控件,即移动鼠标画矩形
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
          if (HeadImageBool)
          {
            Pen p = new Pen(Color.Black, 1);//画笔
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            //Bitmap bitmap = new Bitmap(strHeadImagePath);
            Bitmap bitmap = Bi;
            Rectangle rect = new Rectangle(p3, new Size(System.Math.Abs(p2.X - p1.X), System.Math.Abs(p2.Y - p1.Y)));
            e.Graphics.DrawRectangle(p, rect);
          }
          else
          {
    
          }
        }
        #endregion
      }
    }

    第二部分是辅助方法类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    namespace ImageClassLib
    {
      public class ImageCut1
      {
        #region 剪裁图片方法
        /// <summary> 
        /// 剪裁 -- 用GDI+ 
        /// </summary> 
        /// <param name="b">原始Bitmap,即需要裁剪的图片</param> 
        /// <param name="StartX">开始坐标X</param> 
        /// <param name="StartY">开始坐标Y</param> 
        /// <param name="iWidth">宽度</param> 
        /// <param name="iHeight">高度</param> 
        /// <returns>剪裁后的Bitmap</returns> 
        public Bitmap KiCut1(Bitmap b) 
        { 
          if (b == null) 
          { 
            return null; 
          } 
        
          int w = b.Width; 
          int h = b.Height; 
        
          if (X >= w || Y >= h) 
          { 
            return null; 
          } 
        
          if (X + Width > w) 
          { 
            Width = w - X; 
          } 
        
          if (Y + Height > h) 
          { 
            Height = h - Y; 
          } 
        
          try
          { 
            Bitmap bmpOut = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 
        
            Graphics g = Graphics.FromImage(bmpOut);
            // Create rectangle for displaying image.
            Rectangle destRect = new Rectangle(0, 0, Width, Height);    //所画的矩形正确,它指定所绘制图像的位置和大小。 将图像进行缩放以适合该矩形。
    
            // Create rectangle for source image.
            Rectangle srcRect = new Rectangle(X, Y, Width, Height);   //srcRect参数指定要绘制的 image 对象的矩形部分。 将此部分进行缩放以适合 destRect 参数所指定的矩形。
    
            g.DrawImage(b, destRect, srcRect, GraphicsUnit.Pixel);
            //resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
            g.Dispose(); 
            return bmpOut; 
          } 
          catch
          { 
            return null; 
          } 
        }
        #endregion
        #region ImageCut1类的构造函数
        public int X; 
        public int Y; 
        public int Width ; 
        public int Height;
        /// <summary>
        /// ImageCut1类的构造函数,ImageCut1类用来获取鼠标在pictureBox1控件所画矩形内的图像
        /// </summary>
        /// <param name="x表示鼠标在pictureBox1控件上按下时的横坐标"></param>
        /// <param name="y表示鼠标在pictureBox1控件上按下时的纵坐标"></param>
        /// <param name="width表示鼠标在pictureBox1控件上松开鼠标的宽度"></param>
        /// <param name="heigth表示鼠标在pictureBox1控件上松开鼠标的高度"></param>
        public ImageCut1(int x, int y, int width, int heigth)
        {
          X = x;
          Y = y;
          Width = width;
          Height = heigth;
        }
        #endregion
      }
    }

    实现的效果如下:

    以上就是C# 实现QQ式截图功能实例代码详细介绍的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:C#,QQ式截图
    上一篇:c# 应用NPOI获取Excel中的图片,保存至本地的算法的详细介绍 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • asp.net 图片验证码的HtmlHelper• asp.net反射简单应用实例代码• C#中GDI+编程10个基本技巧二• 【c#教程】C# 命名空间(Namespace)• ASP.NET使用Ajax如何返回Json对象的方法具体介绍
    1/1

    PHP中文网