C#图片压缩裁剪处理
2015-10-27 10:14
267 查看
using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; namespace TestApplicaotion { /// <summary> /// 图片压缩类 /// </summary> public static class CompressedImage { /// <summary> /// 压缩图片 /// </summary> /// <returns></returns> public static bool GetPicThumbnail(PictureSize picSize) { bool reslut; try { var iSource = Image.FromFile(picSize.FilePath); GetSize(iSource, picSize); var ob = Mapping(iSource, picSize); reslut = Compression(iSource, ob, picSize); } catch { reslut = false; } return reslut; } /// <summary> /// 无品质压缩图片 /// </summary> /// <param name="iSource"></param> /// <param name="ob"></param> /// <param name="picSize"></param> /// <returns></returns> public static bool Compression(Image iSource, Bitmap ob, PictureSize picSize) { //以下代码为保存图片时,设置压缩质量 var ep = new EncoderParameters(); var qy = new long[1]; qy[0] = picSize.Flag;//设置压缩的比例1-100 var eParam = new EncoderParameter(Encoder.Quality, qy); ep.Param[0] = eParam; try { var array = ImageCodecInfo.GetImageEncoders(); var jpeginfo = array.FirstOrDefault(t => t.FormatDescription.Equals("JPEG")); if (jpeginfo != null) { ob.Save(picSize.SavePath, jpeginfo, ep);//dFile是压缩后的新路径 } else { ob.Save(picSize.SavePath, iSource.RawFormat); } return true; } catch { return false; } finally { iSource.Dispose(); ob.Dispose(); } } /// <summary> /// 剪切并绘制缩略图 /// </summary> /// <param name="iSource"></param> /// <param name="picSize"></param> /// <returns></returns> public static Bitmap Mapping(Image iSource, PictureSize picSize) { var ob = new Bitmap(picSize.DWidth, picSize.DHeight); var g = Graphics.FromImage(ob); g.Clear(Color.WhiteSmoke); g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage( iSource, new Rectangle( (picSize.DWidth - picSize.SWidth) / 2, (picSize.DHeight - picSize.SHeight) / 2, picSize.SWidth, picSize.SHeight), picSize.MarginX, picSize.MarginY, picSize.Width, picSize.Height, GraphicsUnit.Pixel); g.Dispose(); return ob; } /// <summary> /// 获取图片压缩宽高信息 /// </summary> /// <param name="iSource"></param> /// <param name="picSize"></param> /// <returns></returns> public static PictureSize GetSize(Image iSource, PictureSize picSize) { var temSize = new Size(iSource.Width, iSource.Height); var proportionTemp = (float)temSize.Height / temSize.Width; var proportionZoom = (float)picSize.DHeight / picSize.DWidth; var value = proportionTemp / proportionZoom; if (proportionTemp > proportionZoom) { picSize.Width = temSize.Width; picSize.Height = (int)(temSize.Height / value); picSize.SWidth = picSize.DWidth; picSize.SHeight = (picSize.DWidth * picSize.Height) / temSize.Width; picSize.MarginY = (temSize.Height - picSize.Height) / 2; } else if (proportionTemp < proportionZoom) { picSize.Width = (int)(temSize.Width / value); picSize.Height = temSize.Height; picSize.SHeight = picSize.DHeight; picSize.SWidth = (picSize.Width * picSize.DHeight) / temSize.Height; picSize.MarginX = (temSize.Width - picSize.Width) / 2; } else { picSize.Width = temSize.Width; picSize.Height = temSize.Height; picSize.SWidth = picSize.DWidth; picSize.SHeight = picSize.DHeight; } return picSize; } } /// <summary> /// 图片实体信息。 /// </summary> public class PictureSize { /// <summary> /// 图片宽度 /// </summary> public int Width { get; set; } /// <summary> /// 图片宽度 /// </summary> public int Height { get; set; } /// <summary> /// 缩略图宽度 /// </summary> public int SWidth { get; set; } /// <summary> /// 缩略图高度 /// </summary> public int SHeight { get; set; } /// <summary> /// 设定缩略宽度 /// </summary> public int DWidth { get; set; } /// <summary> /// 设定缩略高度 /// </summary> public int DHeight { get; set; } /// <summary> /// 图片品质 /// </summary> public int Flag { get; set; } /// <summary> /// 图片路径 /// </summary> public string FilePath { get; set; } /// <summary> /// 缩略图保存路径 /// </summary> public string SavePath { get; set; } /// <summary> /// 距离左右宽度 /// </summary> public int MarginX { get; set; } /// <summary> /// 距离上下高度 /// </summary> public int MarginY { get; set; } } }
相关文章推荐
- C# 语言在函数参数列表中出现this关键词的作用
- 浅析C#数据类型转换的几种形式
- C# 对文本文件的几种读写方法总结
- c#写windows服务 小demo
- C#创建Windows Service(Windows 服务)基础教程
- C# 编写Windows Service(windows服务程序)
- CLR via C# 读书笔记---常量、字段、方法和参数
- [C#]多维数组和交叉数组
- C#实现选择文件夹对话框
- VS 2010中使用C#创建及调用WCF完整实例(Windows服务宿主)
- C#中数组、ArrayList和List三者的区别
- C# combox加入时间段 yyyy/mm/dd-yyyy/mm/dd
- C# DataGridView内容合并相同的行
- C#-委派和事件
- C#-XML
- C#-vs2012学习笔记-惊奇于vs的强大和便利
- C#-接口
- C#-ado.net学习笔记-会有更新
- C#-.Net Framework和.Net Compact Framework-摘
- C#-VS支持的语言