1. public class Imager
  2. {
  3. #region 正方型裁剪并缩放
  4.  
  5. /// <summary>
  6. /// 正方型裁剪
  7. /// 以图片中心为轴心,截取正方型,然后等比缩放
  8. /// 用于头像处理
  9. /// </summary>
  10. /// <param name="fromFile">原图Stream对象</param>
  11. /// <param name="fileSaveUrl">缩略图存放地址</param>
  12. /// <param name="side">指定的边长(正方型)</param>
  13. /// <param name="quality">质量(范围0-100)</param>
  14. public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
  15. {
  16. //创建目录
  17. string dir = Path.GetDirectoryName(fileSaveUrl);
  18. if (!Directory.Exists(dir))
  19. Directory.CreateDirectory(dir);
  20.  
  21. //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
  22. System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
  23.  
  24. //原图宽高均小于模版,不作处理,直接保存
  25. if (initImage.Width <= side && initImage.Height <= side) {
  26. initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  27. } else {
  28. //原始图片的宽、高
  29. int initWidth = initImage.Width;
  30. int initHeight = initImage.Height;
  31.  
  32. //非正方型先裁剪为正方型
  33. if (initWidth != initHeight) {
  34. //截图对象
  35. System.Drawing.Image pickedImage = null;
  36. System.Drawing.Graphics pickedG = null;
  37.  
  38. //宽大于高的横图
  39. if (initWidth > initHeight) {
  40. //对象实例化
  41. pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
  42. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  43. //设置质量
  44. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  45. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  46. //定位
  47. Rectangle fromR = new Rectangle((initWidth - initHeight) / , , initHeight, initHeight);
  48. Rectangle toR = new Rectangle(, , initHeight, initHeight);
  49. //画图
  50. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  51. //重置宽
  52. initWidth = initHeight;
  53. }
  54. //高大于宽的竖图
  55. else {
  56. //对象实例化
  57. pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
  58. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  59. //设置质量
  60. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  61. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  62. //定位
  63. Rectangle fromR = new Rectangle(, (initHeight - initWidth) / , initWidth, initWidth);
  64. Rectangle toR = new Rectangle(, , initWidth, initWidth);
  65. //画图
  66. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  67. //重置高
  68. initHeight = initWidth;
  69. }
  70.  
  71. //将截图对象赋给原图
  72. initImage = (System.Drawing.Image)pickedImage.Clone();
  73. //释放截图资源
  74. pickedG.Dispose();
  75. pickedImage.Dispose();
  76. }
  77.  
  78. //缩略图对象
  79. System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
  80. System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
  81. //设置质量
  82. resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  83. resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  84. //用指定背景色清空画布
  85. resultG.Clear(Color.White);
  86. //绘制缩略图
  87. resultG.DrawImage(initImage, new System.Drawing.Rectangle(, , side, side), new System.Drawing.Rectangle(, , initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
  88.  
  89. //关键质量控制
  90. //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
  91. ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
  92. ImageCodecInfo ici = null;
  93. foreach (ImageCodecInfo i in icis) {
  94. if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif") {
  95. ici = i;
  96. }
  97. }
  98. EncoderParameters ep = new EncoderParameters();
  99. ep.Param[] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
  100.  
  101. //保存缩略图
  102. resultImage.Save(fileSaveUrl, ici, ep);
  103.  
  104. //释放关键质量控制所用资源
  105. ep.Dispose();
  106.  
  107. //释放缩略图资源
  108. resultG.Dispose();
  109. resultImage.Dispose();
  110.  
  111. //释放原始图片资源
  112. initImage.Dispose();
  113. }
  114. }
  115.  
  116. #endregion
  117.  
  118. #region 自定义裁剪并缩放
  119.  
  120. /// <summary>
  121. /// 指定长宽裁剪
  122. /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸
  123. /// </summary>
  124. /// <param name="fromFile">原图Stream对象</param>
  125. /// <param name="fileSaveUrl">保存路径</param>
  126. /// <param name="maxWidth">最大宽(单位:px)</param>
  127. /// <param name="maxHeight">最大高(单位:px)</param>
  128. /// <param name="quality">质量(范围0-100)</param>
  129. public static void CutForCustom(System.IO.Stream fromFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)
  130. {
  131. //从文件获取原始图片,并使用流中嵌入的颜色管理信息
  132. System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
  133.  
  134. //原图宽高均小于模版,不作处理,直接保存
  135. if (initImage.Width <= maxWidth && initImage.Height <= maxHeight) {
  136. initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  137. } else {
  138. if (maxWidth == ) maxWidth = initImage.Width;
  139. if (maxHeight == ) maxHeight = initImage.Height;
  140.  
  141. //模版的宽高比例
  142. double templateRate = (double)maxWidth / maxHeight;
  143. //原图片的宽高比例
  144. double initRate = (double)initImage.Width / initImage.Height;
  145.  
  146. //原图与模版比例相等,直接缩放
  147. if (templateRate == initRate) {
  148. //按模版大小生成最终图片
  149. System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
  150. System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
  151. templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  152. templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  153. templateG.Clear(Color.White);
  154. templateG.DrawImage(initImage, new System.Drawing.Rectangle(, , maxWidth, maxHeight), new System.Drawing.Rectangle(, , initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
  155. templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  156. }
  157. //原图与模版比例不等,裁剪后缩放
  158. else {
  159. //裁剪对象
  160. System.Drawing.Image pickedImage = null;
  161. System.Drawing.Graphics pickedG = null;
  162.  
  163. //定位
  164. Rectangle fromR = new Rectangle(, , , );//原图裁剪定位
  165. Rectangle toR = new Rectangle(, , , );//目标定位
  166.  
  167. //宽为标准进行裁剪
  168. if (templateRate > initRate) {
  169. //裁剪对象实例化
  170. pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)System.Math.Floor(initImage.Width / templateRate));
  171. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  172.  
  173. //裁剪源定位
  174. fromR.X = ;
  175. fromR.Y = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / );
  176. fromR.Width = initImage.Width;
  177. fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
  178.  
  179. //裁剪目标定位
  180. toR.X = ;
  181. toR.Y = ;
  182. toR.Width = initImage.Width;
  183. toR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
  184. }
  185. //高为标准进行裁剪
  186. else {
  187. pickedImage = new System.Drawing.Bitmap((int)System.Math.Floor(initImage.Height * templateRate), initImage.Height);
  188. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  189.  
  190. fromR.X = (int)System.Math.Floor((initImage.Width - initImage.Height * templateRate) / );
  191. fromR.Y = ;
  192. fromR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
  193. fromR.Height = initImage.Height;
  194.  
  195. toR.X = ;
  196. toR.Y = ;
  197. toR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
  198. toR.Height = initImage.Height;
  199. }
  200.  
  201. //设置质量
  202. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  203. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  204.  
  205. //裁剪
  206. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  207.  
  208. //按模版大小生成最终图片
  209. System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
  210. System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
  211. templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  212. templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  213. templateG.Clear(Color.White);
  214. templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(, , maxWidth, maxHeight), new System.Drawing.Rectangle(, , pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
  215.  
  216. //关键质量控制
  217. //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
  218. ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
  219. ImageCodecInfo ici = null;
  220. foreach (ImageCodecInfo i in icis) {
  221. if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif") {
  222. ici = i;
  223. }
  224. }
  225. EncoderParameters ep = new EncoderParameters();
  226. ep.Param[] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
  227.  
  228. //保存缩略图
  229. templateImage.Save(fileSaveUrl, ici, ep);
  230. //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  231.  
  232. //释放资源
  233. templateG.Dispose();
  234. templateImage.Dispose();
  235.  
  236. pickedG.Dispose();
  237. pickedImage.Dispose();
  238. }
  239. }
  240.  
  241. //释放资源
  242. initImage.Dispose();
  243. }
  244. #endregion
  245.  
  246. /// <summary>
  247. /// 图片等比缩放
  248. /// </summary>
  249. /// <param name="filePath">原图Stream对象</param>
  250. /// <param name="targetPath">缩略图存放地址</param>
  251. /// <param name="targetWidth">指定的最大宽度</param>
  252. /// <param name="targetHeight">指定的最大高度</param>
  253. /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>
  254. /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>
  255. public static void Resize(string filePath, string targetPath, double targetWidth, double targetHeight, string watermarkText = "", string watermarkImage = "")
  256. {
  257. //创建目录
  258. string dir = Path.GetDirectoryName(targetPath);
  259. if (Directory.Exists(dir) == false) Directory.CreateDirectory(dir);
  260.  
  261. //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
  262. Image initImage = Image.FromFile(filePath, true);
  263.  
  264. //原图宽高均小于模版或目标宽度均为0,不作处理,直接保存
  265. if (initImage.Width <= targetWidth && initImage.Height <= targetHeight || (targetWidth == && targetHeight == )) {
  266. //文字水印
  267. if (watermarkText != "") {
  268. setWatermarkText(initImage, watermarkText);
  269. }
  270.  
  271. //透明图片水印
  272. if (watermarkImage != "") {
  273. setWatermarkImage(initImage, watermarkImage);
  274. }
  275.  
  276. //保存
  277. initImage.Save(targetPath, ImageFormat.Jpeg);
  278.  
  279. } else {
  280. //缩略图宽、高计算
  281. double newWidth = ;
  282. double newHeight = ;
  283. if (targetWidth == ) {
  284. newWidth = initImage.Width * targetHeight / initImage.Height;
  285. newHeight = targetHeight;
  286. } else if(targetHeight == ) {
  287. newWidth = targetWidth;
  288. newHeight = initImage.Height * targetWidth / initImage.Width;
  289. } else {
  290. double scaleWidth = targetWidth / initImage.Width;
  291. double scaleHeight = targetHeight / initImage.Height;
  292. if (scaleWidth > scaleHeight) {
  293. newWidth = initImage.Width * scaleHeight;
  294. newHeight = initImage.Height * scaleHeight;
  295. } else {
  296. newWidth = initImage.Width * scaleWidth;
  297. newHeight = initImage.Height * scaleWidth;
  298. }
  299. }
  300.  
  301. //生成新图
  302. //新建一个bmp图片
  303. Image newImage = new Bitmap((int)newWidth, (int)newHeight);
  304. //新建一个画板
  305. Graphics newG = Graphics.FromImage(newImage);
  306.  
  307. //设置质量
  308. newG.InterpolationMode = InterpolationMode.HighQualityBicubic;
  309. newG.SmoothingMode = SmoothingMode.HighQuality;
  310.  
  311. //置背景色
  312. newG.Clear(Color.White);
  313. //画图
  314. newG.DrawImage(initImage, new Rectangle(, , newImage.Width, newImage.Height), new Rectangle(, , initImage.Width, initImage.Height), GraphicsUnit.Pixel);
  315.  
  316. //文字水印
  317. if (watermarkText != "") {
  318. setWatermarkText(newImage, watermarkText);
  319. }
  320.  
  321. //透明图片水印
  322. if (watermarkImage != "") {
  323. setWatermarkImage(newImage, watermarkImage);
  324. }
  325.  
  326. //保存缩略图
  327. newImage.Save(targetPath, ImageFormat.Jpeg);
  328.  
  329. //释放资源
  330. newG.Dispose();
  331. newImage.Dispose();
  332. }
  333.  
  334. initImage.Dispose();
  335. }
  336.  
  337. private static void setWatermarkText(Image initImage, string watermarkText)
  338. {
  339. using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage)) {
  340. System.Drawing.Font fontWater = new Font("黑体", );
  341. System.Drawing.Brush brushWater = new SolidBrush(Color.White);
  342. gWater.DrawString(watermarkText, fontWater, brushWater, , );
  343. gWater.Dispose();
  344. }
  345. }
  346. private static void setWatermarkImage(Image initImage, string watermarkImage)
  347. {
  348. if (File.Exists(watermarkImage)) {
  349. //获取水印图片
  350. using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage)) {
  351. //水印绘制条件:原始图片宽高均大于或等于水印图片
  352. if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height) {
  353. Graphics gWater = Graphics.FromImage(initImage);
  354.  
  355. //透明属性
  356. ImageAttributes imgAttributes = new ImageAttributes();
  357. ColorMap colorMap = new ColorMap();
  358. colorMap.OldColor = Color.FromArgb(, , , );
  359. colorMap.NewColor = Color.FromArgb(, , , );
  360. ColorMap[] remapTable = { colorMap };
  361. imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
  362.  
  363. float[][] colorMatrixElements = {
  364. new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
  365. new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
  366. new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  367. new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
  368. new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
  369. };
  370.  
  371. ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
  372. imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
  373. gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), , , wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
  374.  
  375. gWater.Dispose();
  376. }
  377. wrImage.Dispose();
  378. }
  379. }
  380. }
  381.  
  382. }

Image图片处理的更多相关文章

  1. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

  2. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  3. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  4. Markdown 图片助手-MarkdownPicPicker

    title: Markdown 图片助手 v0.1 toc: true comments: true date: 2016-06-04 16:40:06 tags: [Python, Markdown ...

  5. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  6. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  7. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  8. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  10. HTML中上传与读取图片或文件(input file)----在路上(25)

    input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...

随机推荐

  1. Python-Day07-图形用户界面和游戏开发

    Python-100Day-学习打卡Author: Seven_0507Date: 2019-05-22123 文章目录Python图形用户界面和游戏开发1. tkinter模块2. Pygame进行 ...

  2. CSS 类名的问题

    以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...

  3. 02Oracle Database 安装,卸载,系统服务,系统组件及系统表空间

    Oracle Database 安装,卸载,系统服务,系统组件及系统表空间 Oracle Database 安装 Oracle Database 卸载 Oracle Database 系统服务 Ora ...

  4. Deepin系统关于每次启动终端都要输入source /etc/profile的问题

    关于每次启动终端都要输入source /etc/profile的问题 当我在Deepin系统中下载了node以及npm之后,我为了将node导入到系统文件,使用了以下命令sudo gedit ``/e ...

  5. 洛谷——P2420 让我们异或吧

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  6. 牛客练习赛25 C 再编号

    解题思路 我们先来观察一下题目中给出的公式 $$a'_i=(\sum_{j=1}^na_j)-a_i$$ 通过这个公式推一下经过再编号后的序列的总和,因为我们推出这个和之后可以进行下一次计算. $$\ ...

  7. Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)

    参考链接:https://www.highcharts.com.cn/docs/process-text-data-file 1.javascript代码 var options = { chart: ...

  8. AWK简单使用方法

    1. 命令格式 gawk [OPTIONS] 'program' FILES.... program:'PATTERN{ACTION}' 一条awk命令中,PATTERN和ACTION,至少存在一个才 ...

  9. git帮助网址

    http://rogerdudler.github.io/git-guide/index.zh.html https://help.github.com/

  10. PyCharm开发GUI之PyQt安装

    开发环境 PyCharm 2018.3.3python3.7 1 安装pyqt5 pip install PyQt5-tools 2 配置PyCharm 2.1 配置设计器 其中,program为C: ...