转自:http://wu-jian.cnblogs.com/

前言

需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分 网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发现一些问题,比如显示排版时想让相片缩略图列表非常统一、整齐、和美观,比如要求每张缩略图大 小固定为120 x 90且不拉伸变形怎么办?再比如用户头像如何让缩略图比原图更清晰?或是如何在上传的图片下加一个半透明的LOGO水印?

OK,本文根据自己的项目代码描述以上问题的解决方案,所谓C#图片处理高级应用,感觉有点标题党了,这些功能并无多大技术含量。全部基于.Net Framework类库完成,代码中包含了C#图片处理的一些基础知识,与大家分享,个人能力有限,不足之处还请及时指正。

提高缩略图清晰度

(原图200*200,12.3k)(处理后80*80,17.7k)

之前一直认为缩略图不可能比原图清晰,直到某天一位产品的同事给我看某网站的效果。于是开始寻找.NET下实现代码,仔细观察缩略图确实比原图更清 晰了一些,但代价是缩略图文件比原图更大,所以如果你想让一张占满显示器屏幕的超大图片更清晰,那么图片占用空间和网络流量就必需考虑了,如果是互联网应 用,建议缩略图在200像素以内的使用该方法。当然如果哪位有更好的代码即能让图片文件大小变化不大又让图片更清晰还请分享。

图片裁剪

(原图256*192)(裁剪要求100*100)

(原图256*192)(裁剪要求90*120)

(原图256*192)(裁剪要求120*90)

(原图146*256)(裁剪要求100*100)

(原图146*256)(裁剪要求90*120)

(原图146*256)(裁剪要求120*90)

算法:以原图中心作为裁剪中心,最大范围的对原图进行裁剪,然后对裁剪结果等比缩放。

图片水印

仅演示了效果,如需要变更字体、水印透明度、位置等可自行在代码或方法中扩展。

代码

封装了几个通用的方法,如发现有BUG或漏洞还请及时指正。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Drawing.Imaging;
  8. namespace WuJian.Common
  9. {
  10. /// <summary>
  11. /// 图片处理类
  12. /// 吴剑 2008-07-02 创建
  13. /// 吴剑 2011-01-21 修改
  14. /// </summary>
  15. public class PTImage
  16. {
  17. #region 正方型裁剪并缩放
  18. /// <summary>
  19. /// 正方型裁剪
  20. /// 以图片中心为轴心,截取正方型,然后等比缩放
  21. /// 用于头像处理
  22. /// </summary>
  23. /// <remarks>吴剑 2010-11-23</remarks>
  24. /// <param name="postedFile">原图HttpPostedFile对象</param>
  25. /// <param name="fileSaveUrl">缩略图存放地址</param>
  26. /// <param name="side">指定的边长(正方型)</param>
  27. /// <param name="quality">质量(范围0-100)</param>
  28. public static void CutForSquare(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int side, int quality)
  29. {
  30. //创建目录
  31. string dir = Path.GetDirectoryName(fileSaveUrl);
  32. if (!Directory.Exists(dir))
  33. Directory.CreateDirectory(dir);
  34. //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
  35. System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
  36. //原图宽高均小于模版,不作处理,直接保存
  37. if (initImage.Width <= side && initImage.Height <= side)
  38. {
  39. initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  40. }
  41. else
  42. {
  43. //原始图片的宽、高
  44. int initWidth = initImage.Width;
  45. int initHeight = initImage.Height;
  46. //非正方型先裁剪为正方型
  47. if (initWidth != initHeight)
  48. {
  49. //截图对象
  50. System.Drawing.Image pickedImage = null;
  51. System.Drawing.Graphics pickedG = null;
  52. //宽大于高的横图
  53. if (initWidth > initHeight)
  54. {
  55. //对象实例化
  56. pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
  57. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  58. //设置质量
  59. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  60. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  61. //定位
  62. Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
  63. Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
  64. //画图
  65. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  66. //重置宽
  67. initWidth = initHeight;
  68. }
  69. //高大于宽的竖图
  70. else
  71. {
  72. //对象实例化
  73. pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
  74. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  75. //设置质量
  76. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  77. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  78. //定位
  79. Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
  80. Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
  81. //画图
  82. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  83. //重置高
  84. initHeight = initWidth;
  85. }
  86. //将截图对象赋给原图
  87. initImage = (System.Drawing.Image)pickedImage.Clone();
  88. //释放截图资源
  89. pickedG.Dispose();
  90. pickedImage.Dispose();
  91. }
  92. //缩略图对象
  93. System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
  94. System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
  95. //设置质量
  96. resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  97. resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  98. //用指定背景色清空画布
  99. resultG.Clear(Color.White);
  100. //绘制缩略图
  101. resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
  102. //关键质量控制
  103. //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
  104. ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
  105. ImageCodecInfo ici = null;
  106. foreach (ImageCodecInfo i in icis)
  107. {
  108. if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
  109. {
  110. ici = i;
  111. }
  112. }
  113. EncoderParameters ep = new EncoderParameters(1);
  114. ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
  115. //保存缩略图
  116. resultImage.Save(fileSaveUrl, ici, ep);
  117. //释放关键质量控制所用资源
  118. ep.Dispose();
  119. //释放缩略图资源
  120. resultG.Dispose();
  121. resultImage.Dispose();
  122. //释放原始图片资源
  123. initImage.Dispose();
  124. }
  125. }
  126. /// <summary>
  127. /// 正方型裁剪
  128. /// 以图片中心为轴心,截取正方型,然后等比缩放
  129. /// 用于头像处理
  130. /// </summary>
  131. /// <remarks>吴剑 2010-11-23</remarks>
  132. /// <param name="postedFile">原图HttpPostedFile对象</param>
  133. /// <param name="fileSaveUrl">缩略图存放地址</param>
  134. /// <param name="side">指定的边长(正方型)</param>
  135. /// <param name="quality">质量(范围0-100)</param>
  136. public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
  137. {
  138. //创建目录
  139. string dir = Path.GetDirectoryName(fileSaveUrl);
  140. if (!Directory.Exists(dir))
  141. Directory.CreateDirectory(dir);
  142. //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
  143. System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
  144. //原图宽高均小于模版,不作处理,直接保存
  145. if (initImage.Width <= side && initImage.Height <= side)
  146. {
  147. initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  148. }
  149. else
  150. {
  151. //原始图片的宽、高
  152. int initWidth = initImage.Width;
  153. int initHeight = initImage.Height;
  154. //非正方型先裁剪为正方型
  155. if (initWidth != initHeight)
  156. {
  157. //截图对象
  158. System.Drawing.Image pickedImage = null;
  159. System.Drawing.Graphics pickedG = null;
  160. //宽大于高的横图
  161. if (initWidth > initHeight)
  162. {
  163. //对象实例化
  164. pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
  165. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  166. //设置质量
  167. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  168. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  169. //定位
  170. Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
  171. Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
  172. //画图
  173. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  174. //重置宽
  175. initWidth = initHeight;
  176. }
  177. //高大于宽的竖图
  178. else
  179. {
  180. //对象实例化
  181. pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
  182. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  183. //设置质量
  184. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  185. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  186. //定位
  187. Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
  188. Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
  189. //画图
  190. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  191. //重置高
  192. initHeight = initWidth;
  193. }
  194. //将截图对象赋给原图
  195. initImage = (System.Drawing.Image)pickedImage.Clone();
  196. //释放截图资源
  197. pickedG.Dispose();
  198. pickedImage.Dispose();
  199. }
  200. //缩略图对象
  201. System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
  202. System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
  203. //设置质量
  204. resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  205. resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  206. //用指定背景色清空画布
  207. resultG.Clear(Color.White);
  208. //绘制缩略图
  209. resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
  210. //关键质量控制
  211. //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
  212. ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
  213. ImageCodecInfo ici = null;
  214. foreach (ImageCodecInfo i in icis)
  215. {
  216. if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
  217. {
  218. ici = i;
  219. }
  220. }
  221. EncoderParameters ep = new EncoderParameters(1);
  222. ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
  223. //保存缩略图
  224. resultImage.Save(fileSaveUrl, ici, ep);
  225. //释放关键质量控制所用资源
  226. ep.Dispose();
  227. //释放缩略图资源
  228. resultG.Dispose();
  229. resultImage.Dispose();
  230. //释放原始图片资源
  231. initImage.Dispose();
  232. }
  233. }
  234. #endregion
  235. #region 固定模版裁剪并缩放
  236. /// <summary>
  237. /// 指定长宽裁剪
  238. /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸
  239. /// </summary>
  240. /// <remarks>吴剑 2010-11-15</remarks>
  241. /// <param name="postedFile">原图HttpPostedFile对象</param>
  242. /// <param name="fileSaveUrl">保存路径</param>
  243. /// <param name="maxWidth">最大宽(单位:px)</param>
  244. /// <param name="maxHeight">最大高(单位:px)</param>
  245. /// <param name="quality">质量(范围0-100)</param>
  246. public static void CutForCustom(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)
  247. {
  248. //从文件获取原始图片,并使用流中嵌入的颜色管理信息
  249. System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
  250. //原图宽高均小于模版,不作处理,直接保存
  251. if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)
  252. {
  253. initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  254. }
  255. else
  256. {
  257. //模版的宽高比例
  258. double templateRate = (double)maxWidth / maxHeight;
  259. //原图片的宽高比例
  260. double initRate = (double)initImage.Width / initImage.Height;
  261. //原图与模版比例相等,直接缩放
  262. if (templateRate == initRate)
  263. {
  264. //按模版大小生成最终图片
  265. System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
  266. System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
  267. templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  268. templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  269. templateG.Clear(Color.White);
  270. 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);
  271. templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  272. }
  273. //原图与模版比例不等,裁剪后缩放
  274. else
  275. {
  276. //裁剪对象
  277. System.Drawing.Image pickedImage = null;
  278. System.Drawing.Graphics pickedG = null;
  279. //定位
  280. Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位
  281. Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位
  282. //宽为标准进行裁剪
  283. if (templateRate > initRate)
  284. {
  285. //裁剪对象实例化
  286. pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)Math.Floor(initImage.Width / templateRate));
  287. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  288. //裁剪源定位
  289. fromR.X = 0;
  290. fromR.Y = (int)Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
  291. fromR.Width = initImage.Width;
  292. fromR.Height = (int)Math.Floor(initImage.Width / templateRate);
  293. //裁剪目标定位
  294. toR.X = 0;
  295. toR.Y = 0;
  296. toR.Width = initImage.Width;
  297. toR.Height = (int)Math.Floor(initImage.Width / templateRate);
  298. }
  299. //高为标准进行裁剪
  300. else
  301. {
  302. pickedImage = new System.Drawing.Bitmap((int)Math.Floor(initImage.Height * templateRate), initImage.Height);
  303. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  304. fromR.X = (int)Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
  305. fromR.Y = 0;
  306. fromR.Width = (int)Math.Floor(initImage.Height * templateRate);
  307. fromR.Height = initImage.Height;
  308. toR.X = 0;
  309. toR.Y = 0;
  310. toR.Width = (int)Math.Floor(initImage.Height * templateRate);
  311. toR.Height = initImage.Height;
  312. }
  313. //设置质量
  314. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  315. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  316. //裁剪
  317. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  318. //按模版大小生成最终图片
  319. System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
  320. System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
  321. templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  322. templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  323. templateG.Clear(Color.White);
  324. 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);
  325. //关键质量控制
  326. //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
  327. ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
  328. ImageCodecInfo ici = null;
  329. foreach (ImageCodecInfo i in icis)
  330. {
  331. if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
  332. {
  333. ici = i;
  334. }
  335. }
  336. EncoderParameters ep = new EncoderParameters(1);
  337. ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
  338. //保存缩略图
  339. templateImage.Save(fileSaveUrl, ici, ep);
  340. //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  341. //释放资源
  342. templateG.Dispose();
  343. templateImage.Dispose();
  344. pickedG.Dispose();
  345. pickedImage.Dispose();
  346. }
  347. }
  348. //释放资源
  349. initImage.Dispose();
  350. }
  351. #endregion
  352. #region 等比缩放
  353. /// <summary>
  354. /// 图片等比缩放
  355. /// </summary>
  356. /// <remarks>吴剑 2011-01-21</remarks>
  357. /// <param name="postedFile">原图HttpPostedFile对象</param>
  358. /// <param name="savePath">缩略图存放地址</param>
  359. /// <param name="targetWidth">指定的最大宽度</param>
  360. /// <param name="targetHeight">指定的最大高度</param>
  361. /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>
  362. /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>
  363. public static void ZoomAuto(System.Web.HttpPostedFile postedFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
  364. {
  365. //创建目录
  366. string dir = Path.GetDirectoryName(savePath);
  367. if (!Directory.Exists(dir))
  368. Directory.CreateDirectory(dir);
  369. //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
  370. System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
  371. //原图宽高均小于模版,不作处理,直接保存
  372. if (initImage.Width <= targetWidth && initImage.Height <= targetHeight)
  373. {
  374. //文字水印
  375. if (watermarkText != "")
  376. {
  377. using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))
  378. {
  379. System.Drawing.Font fontWater = new Font("黑体", 10);
  380. System.Drawing.Brush brushWater = new SolidBrush(Color.White);
  381. gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
  382. gWater.Dispose();
  383. }
  384. }
  385. //透明图片水印
  386. if (watermarkImage != "")
  387. {
  388. if (File.Exists(watermarkImage))
  389. {
  390. //获取水印图片
  391. using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
  392. {
  393. //水印绘制条件:原始图片宽高均大于或等于水印图片
  394. if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height)
  395. {
  396. Graphics gWater = Graphics.FromImage(initImage);
  397. //透明属性
  398. ImageAttributes imgAttributes = new ImageAttributes();
  399. ColorMap colorMap = new ColorMap();
  400. colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
  401. colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
  402. ColorMap[] remapTable = { colorMap };
  403. imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
  404. float[][] colorMatrixElements = {
  405. new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
  406. new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
  407. new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  408. new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
  409. new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
  410. };
  411. ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
  412. imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
  413. 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);
  414. gWater.Dispose();
  415. }
  416. wrImage.Dispose();
  417. }
  418. }
  419. }
  420. //保存
  421. initImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  422. }
  423. else
  424. {
  425. //缩略图宽、高计算
  426. double newWidth = initImage.Width;
  427. double newHeight = initImage.Height;
  428. //宽大于高或宽等于高(横图或正方)
  429. if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
  430. {
  431. //如果宽大于模版
  432. if (initImage.Width > targetWidth)
  433. {
  434. //宽按模版,高按比例缩放
  435. newWidth = targetWidth;
  436. newHeight = initImage.Height * (targetWidth / initImage.Width);
  437. }
  438. }
  439. //高大于宽(竖图)
  440. else
  441. {
  442. //如果高大于模版
  443. if (initImage.Height > targetHeight)
  444. {
  445. //高按模版,宽按比例缩放
  446. newHeight = targetHeight;
  447. newWidth = initImage.Width * (targetHeight / initImage.Height);
  448. }
  449. }
  450. //生成新图
  451. //新建一个bmp图片
  452. System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
  453. //新建一个画板
  454. System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
  455. //设置质量
  456. newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  457. newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  458. //置背景色
  459. newG.Clear(Color.White);
  460. //画图
  461. 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);
  462. //文字水印
  463. if (watermarkText != "")
  464. {
  465. using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
  466. {
  467. System.Drawing.Font fontWater = new Font("宋体", 10);
  468. System.Drawing.Brush brushWater = new SolidBrush(Color.White);
  469. gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
  470. gWater.Dispose();
  471. }
  472. }
  473. //透明图片水印
  474. if (watermarkImage != "")
  475. {
  476. if (File.Exists(watermarkImage))
  477. {
  478. //获取水印图片
  479. using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
  480. {
  481. //水印绘制条件:原始图片宽高均大于或等于水印图片
  482. if (newImage.Width >= wrImage.Width && newImage.Height >= wrImage.Height)
  483. {
  484. Graphics gWater = Graphics.FromImage(newImage);
  485. //透明属性
  486. ImageAttributes imgAttributes = new ImageAttributes();
  487. ColorMap colorMap = new ColorMap();
  488. colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
  489. colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
  490. ColorMap[] remapTable = { colorMap };
  491. imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
  492. float[][] colorMatrixElements = {
  493. new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
  494. new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
  495. new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  496. new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
  497. new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
  498. };
  499. ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
  500. imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
  501. 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);
  502. gWater.Dispose();
  503. }
  504. wrImage.Dispose();
  505. }
  506. }
  507. }
  508. //保存缩略图
  509. newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  510. //释放资源
  511. newG.Dispose();
  512. newImage.Dispose();
  513. initImage.Dispose();
  514. }
  515. }
  516. #endregion
  517. #region 其它
  518. /// <summary>
  519. /// 判断文件类型是否为WEB格式图片
  520. /// (注:JPG,GIF,BMP,PNG)
  521. /// </summary>
  522. /// <param name="contentType">HttpPostedFile.ContentType</param>
  523. /// <returns></returns>
  524. public static bool IsWebImage(string contentType)
  525. {
  526. if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")
  527. {
  528. return true;
  529. }
  530. else
  531. {
  532. return false;
  533. }
  534. }
  535. #endregion
  536. }//end class
  537. }

C#图片处理高级应用(裁剪,缩放,清晰度,水印)的更多相关文章

  1. C#图片处理示例(裁剪,缩放,清晰度,水印)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

  2. 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

  3. 【转载】如何让图片按比例响应式缩放、并自动裁剪的css技巧

    原文: http://blog.csdn.net/oulihong123/article/details/54601030 响应式网站.移动端页面在DIV CSS布局中对于图片列表或图片排版时, 如果 ...

  4. 如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放

    如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放 参考网站:nginx-lua-fas ...

  5. nodejs图片裁剪、缩放、水印

    关于nodejs下图片的裁剪.水印,网上的模块很多,主要如下: gm:https://github.com/aheckmann/gm node-canvas:https://github.com/Au ...

  6. 使用PHP的GD2裁剪 + 缩放图片

    /** * 裁剪 + 缩放图片 * @param array $params 包含x,y,width,height,path * @return string */ public function t ...

  7. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  8. 基于cropper.js的图片上传和裁剪

    项目中要求图片上传并裁剪的功能,之前也有接触过很多图片裁剪插件,效果体验不是很好,今天推荐一款好用的插件-cropper,超级好用,裁剪功能丰富,满足了各种需求. 功能: 1:点击选择图片,弹出文件夹 ...

  9. 解决图片插入word文档后清晰度降低的问题

    解决图片插入word文档后清晰度降低的问题 在默认情况下,word程序会自动压缩插入word文档中的图片以减小整个word文档的.当我们需要插入word文档中的图片保持原始清晰度时,可以通过设置wor ...

随机推荐

  1. go网络编程示例,客户端,服务器端

    http://blog.csdn.net/wangningyu/article/details/22859245 http://blog.csdn.net/wangningyu/article/det ...

  2. 转:三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

    http://blog.csdn.net/liujun13579/article/details/7772491 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相 ...

  3. 在网页中插入CSS样式表的几种方法

    1. 链入外部样式表 链入外部样式表是把样式表保存为一个样式表文件,然后在页面中用<link>标记链接到这个样式表文件,这个<link>标记必须放到页面的<head> ...

  4. Scala:(3)数组

    要点: (1)长度固定使用Array,长度变化的则使用ArrayBuffer. (2)提供初始值时,不使用new. (3)用()访问元素 val a= new Array[String](10)//初 ...

  5. axis2 调用.net基于https的WebService接口

    一.创建证书 1,在IE中访问WSDL的URL,弹出“安全警报”窗口,查看证书->详细信息标签页->复制到文件->下一步->下一步->指定文件名,将证书下载保存为.cer ...

  6. Android Loader详解四:回调及完整例子

    onLoadFinished 这个方法是在前面已创建的装载器已经完成其加载过程后被调用.这个方法保证会在应用到装载器上的数据被释放之前被调用.在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被 ...

  7. Devexpress 之gridControl

    1.gridControl如何去掉主面板? 鼠标右键Run Designer=>OptionsView => ShowGroupPanel=False: 2.gridControl如何设置 ...

  8. Android学习笔记(十三)SharedPreference必须掌握的基础

    我们在开发中,应用程序会保存少量数据,例如一些字符串.一些标记或者一些配置文件,这时候如果去使用SQLite保存这些数据的话,难免会显得大材小用,用起来也不方便,对于这种信息,保存在SharedPre ...

  9. 基于TCP协议的服务器(多线程)

    import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; impo ...

  10. 基于UDP协议的控制台聊天

    这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...