手机
当前位置:查字典教程网 >编程开发 >C#教程 >c#图片缩放图片剪切功能实现(等比缩放)
c#图片缩放图片剪切功能实现(等比缩放)
摘要:所谓c#图片处理高级应,多数是基于.netframework类库完成复制代码代码如下:usingsystem;usingsystem.col...

所谓c#图片处理高级应,多数是基于.net framework类库完成

复制代码 代码如下:

using system;

using system.collections.generic;

using system.text;

using system.io;

using system.drawing;

using system.drawing.drawing2d;

using system.drawing.imaging;

namespace wujian.common

{

/// <summary>

/// 图片处理类

/// </summary>

public class ptimage

{

#region 正方型裁剪并缩放

/// <summary>

/// 正方型裁剪

/// 以图片中心为轴心,截取正方型,然后等比缩放

/// 用于头像处理

/// </summary>

/// <param name="postedfile">原图httppostedfile对象</param>

/// <param name="filesaveurl">缩略图存放地址</param>

/// <param name="side">指定的边长(正方型)</param>

/// <param name="quality">质量(范围0-100)</param>

public static void cutforsquare(system.web.httppostedfile postedfile, string filesaveurl, int side, int quality)

{

//创建目录

string dir = path.getdirectoryname(filesaveurl);

if (!directory.exists(dir))

directory.createdirectory(dir);

//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)

system.drawing.image initimage = system.drawing.image.fromstream(postedfile.inputstream, true);

//原图宽高均小于模版,不作处理,直接保存

if (initimage.width <= side && initimage.height <= side)

{

initimage.save(filesaveurl, system.drawing.imaging.imageformat.jpeg);

}

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();

}

//缩略图对象

system.drawing.image resultimage = new system.drawing.bitmap(side, side);

system.drawing.graphics resultg = system.drawing.graphics.fromimage(resultimage);

//设置质量

resultg.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybicubic;

resultg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

//用指定背景色清空画布

resultg.clear(color.white);

//绘制缩略图

resultg.drawimage(initimage, new system.drawing.rectangle(0, 0, side, side), new system.drawing.rectangle(0, 0, initwidth, initheight), system.drawing.graphicsunit.pixel);

//关键质量控制

//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff

imagecodecinfo[] icis = imagecodecinfo.getimageencoders();

imagecodecinfo ici = null;

foreach (imagecodecinfo i in icis)

{

if (i.mimetype == "image/jpeg" || i.mimetype == "image/bmp" || i.mimetype == "image/png" || i.mimetype == "image/gif")

{

ici = i;

}

}

encoderparameters ep = new encoderparameters(1);

ep.param[0] = new encoderparameter(system.drawing.imaging.encoder.quality, (long)quality);

//保存缩略图

resultimage.save(filesaveurl, ici, ep);

//释放关键质量控制所用资源

ep.dispose();

//释放缩略图资源

resultg.dispose();

resultimage.dispose();

//释放原始图片资源

initimage.dispose();

}

}

/// <summary>

/// 正方型裁剪

/// 以图片中心为轴心,截取正方型,然后等比缩放

/// 用于头像处理

/// </summary>

/// <param name="postedfile">原图httppostedfile对象</param>

/// <param name="filesaveurl">缩略图存放地址</param>

/// <param name="side">指定的边长(正方型)</param>

/// <param name="quality">质量(范围0-100)</param>

public static void cutforsquare(system.io.stream fromfile, string filesaveurl, int side, int quality)

{

//创建目录

string dir = path.getdirectoryname(filesaveurl);

if (!directory.exists(dir))

directory.createdirectory(dir);

//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)

system.drawing.image initimage = system.drawing.image.fromstream(fromfile, true);

//原图宽高均小于模版,不作处理,直接保存

if (initimage.width <= side && initimage.height <= side)

{

initimage.save(filesaveurl, system.drawing.imaging.imageformat.jpeg);

}

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();

}

//缩略图对象

system.drawing.image resultimage = new system.drawing.bitmap(side, side);

system.drawing.graphics resultg = system.drawing.graphics.fromimage(resultimage);

//设置质量

resultg.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybicubic;

resultg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

//用指定背景色清空画布

resultg.clear(color.white);

//绘制缩略图

resultg.drawimage(initimage, new system.drawing.rectangle(0, 0, side, side), new system.drawing.rectangle(0, 0, initwidth, initheight), system.drawing.graphicsunit.pixel);

//关键质量控制

//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff

imagecodecinfo[] icis = imagecodecinfo.getimageencoders();

imagecodecinfo ici = null;

foreach (imagecodecinfo i in icis)

{

if (i.mimetype == "image/jpeg" || i.mimetype == "image/bmp" || i.mimetype == "image/png" || i.mimetype == "image/gif")

{

ici = i;

}

}

encoderparameters ep = new encoderparameters(1);

ep.param[0] = new encoderparameter(system.drawing.imaging.encoder.quality, (long)quality);

//保存缩略图

resultimage.save(filesaveurl, ici, ep);

//释放关键质量控制所用资源

ep.dispose();

//释放缩略图资源

resultg.dispose();

resultimage.dispose();

//释放原始图片资源

initimage.dispose();

}

}

#endregion

#region 固定模版裁剪并缩放

/// <summary>

/// 指定长宽裁剪

/// 按模版比例最大范围的裁剪图片并缩放至模版尺寸

/// </summary>

/// <param name="postedfile">原图httppostedfile对象</param>

/// <param name="filesaveurl">保存路径</param>

/// <param name="maxwidth">最大宽(单位:px)</param>

/// <param name="maxheight">最大高(单位:px)</param>

/// <param name="quality">质量(范围0-100)</param>

public static void cutforcustom(system.web.httppostedfile postedfile, string filesaveurl, int maxwidth, int maxheight, int quality)

{

//从文件获取原始图片,并使用流中嵌入的颜色管理信息

system.drawing.image initimage = system.drawing.image.fromstream(postedfile.inputstream, true);

//原图宽高均小于模版,不作处理,直接保存

if (initimage.width <= maxwidth && initimage.height <= maxheight)

{

initimage.save(filesaveurl, system.drawing.imaging.imageformat.jpeg);

}

else

{

//模版的宽高比例

double templaterate = (double)maxwidth / maxheight;

//原图片的宽高比例

double initrate = (double)initimage.width / initimage.height;

//原图与模版比例相等,直接缩放

if (templaterate == initrate)

{

//按模版大小生成最终图片

system.drawing.image templateimage = new system.drawing.bitmap(maxwidth, maxheight);

system.drawing.graphics templateg = system.drawing.graphics.fromimage(templateimage);

templateg.interpolationmode = system.drawing.drawing2d.interpolationmode.high;

templateg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

templateg.clear(color.white);

templateg.drawimage(initimage, new system.drawing.rectangle(0, 0, maxwidth, maxheight), new system.drawing.rectangle(0, 0, initimage.width, initimage.height), system.drawing.graphicsunit.pixel);

templateimage.save(filesaveurl, system.drawing.imaging.imageformat.jpeg);

}

//原图与模版比例不等,裁剪后缩放

else

{

//裁剪对象

system.drawing.image pickedimage = null;

system.drawing.graphics pickedg = null;

//定位

rectangle fromr = new rectangle(0, 0, 0, 0);//原图裁剪定位

rectangle tor = new rectangle(0, 0, 0, 0);//目标定位

//宽为标准进行裁剪

if (templaterate > initrate)

{

//裁剪对象实例化

pickedimage = new system.drawing.bitmap(initimage.width, (int)math.floor(initimage.width / templaterate));

pickedg = system.drawing.graphics.fromimage(pickedimage);

//裁剪源定位

fromr.x = 0;

fromr.y = (int)math.floor((initimage.height - initimage.width / templaterate) / 2);

fromr.width = initimage.width;

fromr.height = (int)math.floor(initimage.width / templaterate);

//裁剪目标定位

tor.x = 0;

tor.y = 0;

tor.width = initimage.width;

tor.height = (int)math.floor(initimage.width / templaterate);

}

//高为标准进行裁剪

else

{

pickedimage = new system.drawing.bitmap((int)math.floor(initimage.height * templaterate), initimage.height);

pickedg = system.drawing.graphics.fromimage(pickedimage);

fromr.x = (int)math.floor((initimage.width - initimage.height * templaterate) / 2);

fromr.y = 0;

fromr.width = (int)math.floor(initimage.height * templaterate);

fromr.height = initimage.height;

tor.x = 0;

tor.y = 0;

tor.width = (int)math.floor(initimage.height * templaterate);

tor.height = initimage.height;

}

//设置质量

pickedg.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybicubic;

pickedg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

//裁剪

pickedg.drawimage(initimage, tor, fromr, system.drawing.graphicsunit.pixel);

//按模版大小生成最终图片

system.drawing.image templateimage = new system.drawing.bitmap(maxwidth, maxheight);

system.drawing.graphics templateg = system.drawing.graphics.fromimage(templateimage);

templateg.interpolationmode = system.drawing.drawing2d.interpolationmode.high;

templateg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

templateg.clear(color.white);

templateg.drawimage(pickedimage, new system.drawing.rectangle(0, 0, maxwidth, maxheight), new system.drawing.rectangle(0, 0, pickedimage.width, pickedimage.height), system.drawing.graphicsunit.pixel);

//关键质量控制

//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff

imagecodecinfo[] icis = imagecodecinfo.getimageencoders();

imagecodecinfo ici = null;

foreach (imagecodecinfo i in icis)

{

if (i.mimetype == "image/jpeg" || i.mimetype == "image/bmp" || i.mimetype == "image/png" || i.mimetype == "image/gif")

{

ici = i;

}

}

encoderparameters ep = new encoderparameters(1);

ep.param[0] = new encoderparameter(system.drawing.imaging.encoder.quality, (long)quality);

//保存缩略图

templateimage.save(filesaveurl, ici, ep);

//templateimage.save(filesaveurl, system.drawing.imaging.imageformat.jpeg);

//释放资源

templateg.dispose();

templateimage.dispose();

pickedg.dispose();

pickedimage.dispose();

}

}

//释放资源

initimage.dispose();

}

#endregion

#region 等比缩放

/// <summary>

/// 图片等比缩放

/// </summary>

/// <param name="postedfile">原图httppostedfile对象</param>

/// <param name="savepath">缩略图存放地址</param>

/// <param name="targetwidth">指定的最大宽度</param>

/// <param name="targetheight">指定的最大高度</param>

/// <param name="watermarktext">水印文字(为""表示不使用水印)</param>

/// <param name="watermarkimage">水印图片路径(为""表示不使用水印)</param>

public static void zoomauto(system.web.httppostedfile postedfile, string savepath, system.double targetwidth, system.double targetheight, string watermarktext, string watermarkimage)

{

//创建目录

string dir = path.getdirectoryname(savepath);

if (!directory.exists(dir))

directory.createdirectory(dir);

//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)

system.drawing.image initimage = system.drawing.image.fromstream(postedfile.inputstream, true);

//原图宽高均小于模版,不作处理,直接保存

if (initimage.width <= targetwidth && initimage.height <= targetheight)

{

//文字水印

if (watermarktext != "")

{

using (system.drawing.graphics gwater = system.drawing.graphics.fromimage(initimage))

{

system.drawing.font fontwater = new font("黑体", 10);

system.drawing.brush brushwater = new solidbrush(color.white);

gwater.drawstring(watermarktext, fontwater, brushwater, 10, 10);

gwater.dispose();

}

}

//透明图片水印

if (watermarkimage != "")

{

if (file.exists(watermarkimage))

{

//获取水印图片

using (system.drawing.image wrimage = system.drawing.image.fromfile(watermarkimage))

{

//水印绘制条件:原始图片宽高均大于或等于水印图片

if (initimage.width >= wrimage.width && initimage.height >= wrimage.height)

{

graphics gwater = graphics.fromimage(initimage);

//透明属性

imageattributes imgattributes = new imageattributes();

colormap colormap = new colormap();

colormap.oldcolor = color.fromargb(255, 0, 255, 0);

colormap.newcolor = color.fromargb(0, 0, 0, 0);

colormap[] remaptable = { colormap };

imgattributes.setremaptable(remaptable, coloradjusttype.bitmap);

float[][] colormatrixelements = {

new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},

new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},

new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},

new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5

new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}

};

colormatrix wmcolormatrix = new colormatrix(colormatrixelements);

imgattributes.setcolormatrix(wmcolormatrix, colormatrixflag.default, coloradjusttype.bitmap);

gwater.drawimage(wrimage, new rectangle(initimage.width - wrimage.width, initimage.height - wrimage.height, wrimage.width, wrimage.height), 0, 0, wrimage.width, wrimage.height, graphicsunit.pixel, imgattributes);

gwater.dispose();

}

wrimage.dispose();

}

}

}

//保存

initimage.save(savepath, system.drawing.imaging.imageformat.jpeg);

}

else

{

//缩略图宽、高计算

double newwidth = initimage.width;

double newheight = initimage.height;

//宽大于高或宽等于高(横图或正方)

if (initimage.width > initimage.height || initimage.width == initimage.height)

{

//如果宽大于模版

if (initimage.width > targetwidth)

{

//宽按模版,高按比例缩放

newwidth = targetwidth;

newheight = initimage.height * (targetwidth / initimage.width);

}

}

//高大于宽(竖图)

else

{

//如果高大于模版

if (initimage.height > targetheight)

{

//高按模版,宽按比例缩放

newheight = targetheight;

newwidth = initimage.width * (targetheight / initimage.height);

}

}

//生成新图

//新建一个bmp图片

system.drawing.image newimage = new system.drawing.bitmap((int)newwidth, (int)newheight);

//新建一个画板

system.drawing.graphics newg = system.drawing.graphics.fromimage(newimage);

//设置质量

newg.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybicubic;

newg.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;

//置背景色

newg.clear(color.white);

//画图

newg.drawimage(initimage, new system.drawing.rectangle(0, 0, newimage.width, newimage.height), new system.drawing.rectangle(0, 0, initimage.width, initimage.height), system.drawing.graphicsunit.pixel);

//文字水印

if (watermarktext != "")

{

using (system.drawing.graphics gwater = system.drawing.graphics.fromimage(newimage))

{

system.drawing.font fontwater = new font("宋体", 10);

system.drawing.brush brushwater = new solidbrush(color.white);

gwater.drawstring(watermarktext, fontwater, brushwater, 10, 10);

gwater.dispose();

}

}

//透明图片水印

if (watermarkimage != "")

{

if (file.exists(watermarkimage))

{

//获取水印图片

using (system.drawing.image wrimage = system.drawing.image.fromfile(watermarkimage))

{

//水印绘制条件:原始图片宽高均大于或等于水印图片

if (newimage.width >= wrimage.width && newimage.height >= wrimage.height)

{

graphics gwater = graphics.fromimage(newimage);

//透明属性

imageattributes imgattributes = new imageattributes();

colormap colormap = new colormap();

colormap.oldcolor = color.fromargb(255, 0, 255, 0);

colormap.newcolor = color.fromargb(0, 0, 0, 0);

colormap[] remaptable = { colormap };

imgattributes.setremaptable(remaptable, coloradjusttype.bitmap);

float[][] colormatrixelements = {

new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},

new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},

new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},

new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5

new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}

};

colormatrix wmcolormatrix = new colormatrix(colormatrixelements);

imgattributes.setcolormatrix(wmcolormatrix, colormatrixflag.default, coloradjusttype.bitmap);

gwater.drawimage(wrimage, new rectangle(newimage.width - wrimage.width, newimage.height - wrimage.height, wrimage.width, wrimage.height), 0, 0, wrimage.width, wrimage.height, graphicsunit.pixel, imgattributes);

gwater.dispose();

}

wrimage.dispose();

}

}

}

//保存缩略图

newimage.save(savepath, system.drawing.imaging.imageformat.jpeg);

//释放资源

newg.dispose();

newimage.dispose();

initimage.dispose();

}

}

#endregion

#region 其它

/// <summary>

/// 判断文件类型是否为web格式图片

/// (注:jpg,gif,bmp,png)

/// </summary>

/// <param name="contenttype">httppostedfile.contenttype</param>

/// <returns></returns>

public static bool iswebimage(string contenttype)

{

if (contenttype == "image/pjpeg" || contenttype == "image/jpeg" || contenttype == "image/gif" || contenttype == "image/bmp" || contenttype == "image/png")

{

return true;

}

else

{

return false;

}

}

#endregion

}//end class

}

【c#图片缩放图片剪切功能实现(等比缩放)】相关文章:

C# 语音功能的实现方法

基于c#图像灰度化、灰度反转、二值化的实现方法详解

C#获取进程的主窗口句柄的实现方法

关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法

用.NET创建Windows服务的方法第1/2页

c#图片添加水印的实例代码

c# 图片加密解密的实例代码

C# L型棋牌覆盖实现代码与效果

c# 网址压缩简单实现短网址

深入Resource实现多语言支持的应用详解

精品推荐
分类导航