C# 实现QQ式截图功能实例代码

作者:FelixWang 时间:2022-04-04 03:48:12 

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


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式截图功能实例代码

来源:http://www.cnblogs.com/felix-wang/p/6367314.html

标签:截图,C#
0
投稿

猜你喜欢

  • Android开发时尽管已root但是ddms还是没有data路径怎么办

    2023-01-28 03:19:36
  • 浅析Java中JSONObject和JSONArray使用

    2022-06-05 14:58:30
  • C#实现组合排列的方法

    2021-10-04 02:25:01
  • springBoot Junit测试用例出现@Autowired不生效的解决

    2023-01-24 12:57:59
  • 基于ReentrantLock的实现原理讲解

    2023-11-23 22:43:23
  • Android主线程和子线程区别详解

    2023-12-18 17:33:38
  • java15新功能的详细讲解

    2023-08-23 04:40:21
  • C#如何自动识别文件的编码

    2022-10-08 01:41:43
  • 详解java调用python的几种用法(看这篇就够了)

    2023-04-10 22:15:57
  • Android编程设计模式之Builder模式实例详解

    2023-02-02 05:34:57
  • Android编程学习之抽象类AbsListView用法实例分析

    2023-03-18 12:19:49
  • 详解Android App中ViewPager使用PagerAdapter的方法

    2021-12-06 06:11:52
  • 详解JDK中ExecutorService与Callable和Future对线程的支持

    2023-11-25 07:39:07
  • 浅谈AnDroidDraw+DroidDraw实现Android程序UI设计的分析说明

    2023-09-28 20:41:51
  • java实现点击按钮弹出新窗体功能

    2022-02-18 14:39:55
  • WPF+ASP.NET SignalR实现动态折线图的绘制

    2021-11-28 08:13:43
  • Compose开发之动画艺术探索及实现示例

    2023-09-13 04:16:16
  • Maven学习----Maven安装与环境变量配置教程

    2021-12-04 08:20:25
  • java算法题解牛客BM99顺时针旋转矩阵示例

    2021-07-08 18:55:18
  • 两种JAVA实现短网址服务算法

    2023-05-08 12:17:30
  • asp之家 软件编程 m.aspxhome.com