本篇文章主要介绍了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式截图功能实例代码详细介绍的内容。