文章引用自http://www.hackpig.cn/post/115.html,自己略微作了些修改

代码   
  1. using System;
  2. using System.IO;
  3. using System.Collections;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Drawing.Imaging;
  7. namespace Imag_writer
  8. {
  9. /// <summary>
  10. /// 水印的类型
  11. /// </summary>
  12. public enum WaterMarkType
  13. {
  14. /// <summary>
  15. /// 文字水印
  16. /// </summary>
  17. TextMark,
  18. /// <summary>
  19. /// 图片水印
  20. /// </summary>
  21. //ImageMark // 暂时只能添加文字水印
  22. };
  23. /// <summary>
  24. /// 水印的位置
  25. /// </summary>
  26. public enum WaterMarkPosition
  27. {
  28. /// <summary>
  29. /// 左上角
  30. /// </summary>
  31. WMP_Left_Top,
  32. /// <summary>
  33. /// 左下角
  34. /// </summary>
  35. WMP_Left_Bottom,
  36. /// <summary>
  37. /// 右上角
  38. /// </summary>
  39. WMP_Right_Top,
  40. /// <summary>
  41. /// 右下角
  42. /// </summary>
  43. WMP_Right_Bottom
  44. };
  45. /// <summary>
  46. /// 指定水印的位置
  47. /// </summary>
  48. public class Position
  49. {
  50. /// <summary>
  51. /// 左上角
  52. /// </summary>
  53. public string WM_TOP_LEFT = "WM_TOP_LEFT";
  54. /// <summary>
  55. /// 左下角
  56. /// </summary>
  57. public string WM_BOTTOM_LEFT = "WM_BOTTOM_LEFT";
  58. /// <summary>
  59. /// 右上角
  60. /// </summary>
  61. public string WM_TOP_RIGHT = "WM_TOP_RIGHT";
  62. /// <summary>
  63. /// 右下角
  64. /// </summary>
  65. public string WM_BOTTOM_RIGHT = "WM_BOTTOM_RIGHT";
  66. }
  67. /// <summary>
  68. /// 处理图片的类(包括加水印,生成缩略图)
  69. /// </summary>
  70. public class ImageWaterMark
  71. {
  72. public ImageWaterMark()
  73. {
  74. //
  75. // TODO: 在此处添加构造函数逻辑
  76. //
  77. }
  78. #region 给图片加水印
  79. /// <summary>
  80. /// 添加水印(分图片水印与文字水印两种)
  81. /// </summary>
  82. /// <param name="oldpath">原图片绝对地址</param>
  83. /// <param name="newpath">新图片放置的绝对地址</param>
  84. /// <param name="wmtType">要添加的水印的类型</param>
  85. /// <param name="sWaterMarkContent">水印内容,若添加文字水印,此即为要添加的文字;
  86. /// 若要添加图片水印,此为图片的路径</param>
  87. public void addWaterMark(string oldpath, string newpath,
  88. WaterMarkType wmtType, string sWaterMarkContent, string position)
  89. {
  90. try
  91. {
  92. Image image = Image.FromFile(oldpath);
  93. Bitmap b = new Bitmap(image.Width, image.Height,
  94. PixelFormat.Format24bppRgb);
  95. Graphics g = Graphics.FromImage(b);
  96. g.Clear(Color.White);
  97. g.SmoothingMode = SmoothingMode.HighQuality;
  98. g.InterpolationMode = InterpolationMode.High;
  99. g.DrawImage(image, 0, 0, image.Width, image.Height);
  100. switch (wmtType)
  101. {
  102. case WaterMarkType.TextMark:
  103. //文字水印
  104. //this.addWatermarkText(g, sWaterMarkContent, "WM_BOTTOM_RIGHT",
  105. // image.Width, image.Height);
  106. this.addWatermarkText(g, sWaterMarkContent, position,
  107. image.Width, image.Height);
  108. break;
  109. }
  110. b.Save(newpath);
  111. b.Dispose();
  112. image.Dispose();
  113. }
  114. catch
  115. {
  116. if (File.Exists(oldpath))
  117. {
  118. File.Delete(oldpath);
  119. }
  120. }
  121. finally
  122. {
  123. if (File.Exists(oldpath))
  124. {
  125. File.Delete(oldpath);
  126. }
  127. }
  128. }
  129. /// <summary>
  130. ///   加水印文字
  131. /// </summary>
  132. /// <param name="picture">imge 对象</param>
  133. /// <param name="_watermarkText">水印文字内容</param>
  134. /// <param name="_watermarkPosition">水印位置</param>
  135. /// <param name="_width">被加水印图片的宽</param>
  136. /// <param name="_height">被加水印图片的高</param>
  137. private void addWatermarkText(Graphics picture, string _watermarkText,
  138. string _watermarkPosition, int _width, int _height)
  139. {
  140. // 确定水印文字的字体大小
  141. int[] sizes = new int[] { 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4 };
  142. Font crFont = null;
  143. SizeF crSize = new SizeF();
  144. for (int i = 0; i < sizes.Length; i++)
  145. {
  146. crFont = new Font("Arial Black", sizes[i], FontStyle.Bold);
  147. crSize = picture.MeasureString(_watermarkText, crFont);
  148. if ((ushort)crSize.Width < (ushort)_width)
  149. {
  150. break;
  151. }
  152. }
  153. // 生成水印图片(将文字写到图片中)
  154. Bitmap floatBmp = new Bitmap((int)crSize.Width + 3,
  155. (int)crSize.Height + 3, PixelFormat.Format32bppArgb);
  156. Graphics fg = Graphics.FromImage(floatBmp);
  157. PointF pt = new PointF(0, 0);
  158. // 画阴影文字
  159. Brush TransparentBrush0 = new SolidBrush(Color.FromArgb(255, Color.Black));
  160. Brush TransparentBrush1 = new SolidBrush(Color.FromArgb(255, Color.Black));
  161. fg.DrawString(_watermarkText, crFont, TransparentBrush0, pt.X, pt.Y + 1);
  162. fg.DrawString(_watermarkText, crFont, TransparentBrush0, pt.X + 1, pt.Y);
  163. fg.DrawString(_watermarkText, crFont, TransparentBrush1, pt.X + 1, pt.Y + 1);
  164. fg.DrawString(_watermarkText, crFont, TransparentBrush1, pt.X, pt.Y + 2);
  165. fg.DrawString(_watermarkText, crFont, TransparentBrush1, pt.X + 2, pt.Y);
  166. TransparentBrush0.Dispose();
  167. TransparentBrush1.Dispose();
  168. // 画文字
  169. fg.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  170. fg.DrawString(_watermarkText,
  171. crFont, new SolidBrush(Color.White),
  172. pt.X, pt.Y, StringFormat.GenericDefault);
  173. // 保存刚才的操作
  174. fg.Save();
  175. fg.Dispose();
  176. // floatBmp.Save("d:\WebSite\DIGITALKM\ttt.jpg");
  177. // 将水印图片加到原图中
  178. this.addWatermarkImage(
  179. picture,
  180. new Bitmap(floatBmp),
  181. _watermarkPosition,//"WM_BOTTOM_RIGHT",
  182. _width,
  183. _height);
  184. }
  185. /// <summary>
  186. ///   加水印图片
  187. /// </summary>
  188. /// <param name="picture">imge 对象</param>
  189. /// <param name="iTheImage">Image对象(以此图片为水印)</param>
  190. /// <param name="_watermarkPosition">水印位置</param>
  191. /// <param name="_width">被加水印图片的宽</param>
  192. /// <param name="_height">被加水印图片的高</param>
  193. private void addWatermarkImage(Graphics picture, Image iTheImage,
  194. string _watermarkPosition, int _width, int _height)
  195. {
  196. Image watermark = new Bitmap(iTheImage);
  197. ImageAttributes imageAttributes = new ImageAttributes();
  198. ColorMap colorMap = new ColorMap();
  199. colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
  200. colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
  201. ColorMap[] remapTable = { colorMap };
  202. imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
  203. float[][] colorMatrixElements = {
  204.              new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
  205.              new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
  206.              new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  207.              new float[] {0.0f, 0.0f, 0.0f, 0.3f, 0.0f},
  208.              new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
  209.             };
  210. ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
  211. imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
  212. int xpos = 0;
  213. int ypos = 0;
  214. int WatermarkWidth = 0;
  215. int WatermarkHeight = 0;
  216. double bl = 1d;
  217. //计算水印图片的比率
  218. //取背景的1/4宽度来比较
  219. if ((_width > watermark.Width * 4) && (_height > watermark.Height * 4))
  220. {
  221. bl = 1;
  222. }
  223. else if ((_width > watermark.Width * 4) && (_height < watermark.Height * 4))
  224. {
  225. bl = Convert.ToDouble(_height / 4) / Convert.ToDouble(watermark.Height);
  226. }
  227. else if ((_width < watermark.Width * 4) && (_height > watermark.Height * 4))
  228. {
  229. bl = Convert.ToDouble(_width / 4) / Convert.ToDouble(watermark.Width);
  230. }
  231. else
  232. {
  233. if ((_width * watermark.Height) > (_height * watermark.Width))
  234. {
  235. bl = Convert.ToDouble(_height / 4) / Convert.ToDouble(watermark.Height);
  236. }
  237. else
  238. {
  239. bl = Convert.ToDouble(_width / 4) / Convert.ToDouble(watermark.Width);
  240. }
  241. }
  242. WatermarkWidth = Convert.ToInt32(watermark.Width * bl);
  243. WatermarkHeight = Convert.ToInt32(watermark.Height * bl);
  244. switch (_watermarkPosition)
  245. {
  246. case "WM_TOP_LEFT":
  247. xpos = 10;
  248. ypos = 10;
  249. break;
  250. case "WM_TOP_RIGHT":
  251. xpos = _width - WatermarkWidth - 10;
  252. ypos = 10;
  253. break;
  254. case "WM_BOTTOM_RIGHT":
  255. xpos = _width - WatermarkWidth - 10;
  256. ypos = _height - WatermarkHeight - 10;
  257. break;
  258. case "WM_BOTTOM_LEFT":
  259. xpos = 10;
  260. ypos = _height - WatermarkHeight - 10;
  261. break;
  262. }
  263. picture.DrawImage(
  264. watermark,
  265. new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight),
  266. 0,
  267. 0,
  268. watermark.Width,
  269. watermark.Height,
  270. GraphicsUnit.Pixel,
  271. imageAttributes);
  272. watermark.Dispose();
  273. imageAttributes.Dispose();
  274. }
  275. /// <summary>
  276. ///   加水印图片
  277. /// </summary>
  278. /// <param name="picture">imge 对象</param>
  279. /// <param name="WaterMarkPicPath">水印图片的地址</param>
  280. /// <param name="_watermarkPosition">水印位置</param>
  281. /// <param name="_width">被加水印图片的宽</param>
  282. /// <param name="_height">被加水印图片的高</param>
  283. private void addWatermarkImage(Graphics picture, string WaterMarkPicPath,
  284. string _watermarkPosition, int _width, int _height)
  285. {
  286. Image watermark = new Bitmap(WaterMarkPicPath);
  287. this.addWatermarkImage(picture, watermark, _watermarkPosition, _width,
  288. _height);
  289. }
  290. #endregion
  291. #region 生成缩略图
  292. /// <summary>
  293. /// 保存图片
  294. /// </summary>
  295. /// <param name="image">Image 对象</param>
  296. /// <param name="savePath">保存路径</param>
  297. /// <param name="ici">指定格式的编解码参数</param>
  298. private void SaveImage(Image image, string savePath, ImageCodecInfo ici)
  299. {
  300. //设置 原图片 对象的 EncoderParameters 对象
  301. EncoderParameters parameters = new EncoderParameters(1);
  302. parameters.Param[0] = new EncoderParameter(
  303. System.Drawing.Imaging.Encoder.Quality, ((long)90));
  304. image.Save(savePath, ici, parameters);
  305. parameters.Dispose();
  306. }
  307. /// <summary>
  308. /// 获取图像编码解码器的所有相关信息
  309. /// </summary>
  310. /// <param name="mimeType">包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串</param>
  311. /// <returns>返回图像编码解码器的所有相关信息</returns>
  312. private ImageCodecInfo GetCodecInfo(string mimeType)
  313. {
  314. ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
  315. foreach (ImageCodecInfo ici in CodecInfo)
  316. {
  317. if (ici.MimeType == mimeType)
  318. return ici;
  319. }
  320. return null;
  321. }
  322. /// <summary>
  323. /// 生成缩略图
  324. /// </summary>
  325. /// <param name="sourceImagePath">原图片路径(相对路径)</param>
  326. /// <param name="thumbnailImagePath">生成的缩略图路径,如果为空则保存为原图片路径(相对路径)</param>
  327. /// <param name="thumbnailImageWidth">缩略图的宽度(高度与按源图片比例自动生成)</param>
  328. public void ToThumbnailImages(
  329. string SourceImagePath,
  330. string ThumbnailImagePath,
  331. int ThumbnailImageWidth)
  332. {
  333. Hashtable htmimes = new Hashtable();
  334. htmimes[".jpeg"] = "image/jpeg";
  335. htmimes[".jpg"] = "image/jpeg";
  336. htmimes[".png"] = "image/png";
  337. htmimes[".tif"] = "image/tiff";
  338. htmimes[".tiff"] = "image/tiff";
  339. htmimes[".bmp"] = "image/bmp";
  340. htmimes[".gif"] = "image/gif";
  341. // 取得原图片的后缀
  342. string sExt = SourceImagePath.Substring(
  343. SourceImagePath.LastIndexOf(".")).ToLower();
  344. //从 原图片创建 Image 对象
  345. Image image = Image.FromFile(SourceImagePath);
  346. int num = ((ThumbnailImageWidth / 4) * 3);
  347. int width = image.Width;
  348. int height = image.Height;
  349. //计算图片的比例
  350. if ((((double)width) / ((double)height)) >= 1.3333333333333333f)
  351. {
  352. num = ((height * ThumbnailImageWidth) / width);
  353. }
  354. else
  355. {
  356. ThumbnailImageWidth = ((width * num) / height);
  357. }
  358. if ((ThumbnailImageWidth < 1) || (num < 1))
  359. {
  360. return;
  361. }
  362. //用指定的大小和格式初始化 Bitmap 类的新实例
  363. Bitmap bitmap = new Bitmap(ThumbnailImageWidth, num,
  364. PixelFormat.Format32bppArgb);
  365. //从指定的 Image 对象创建新 Graphics 对象
  366. Graphics graphics = Graphics.FromImage(bitmap);
  367. //清除整个绘图面并以透明背景色填充
  368. graphics.Clear(Color.Transparent);
  369. graphics.SmoothingMode = SmoothingMode.HighQuality;
  370. graphics.InterpolationMode = InterpolationMode.High;
  371. //在指定位置并且按指定大小绘制 原图片 对象
  372. graphics.DrawImage(image, new Rectangle(0, 0, ThumbnailImageWidth, num));
  373. image.Dispose();
  374. try
  375. {
  376. //将此 原图片 以指定格式并用指定的编解码参数保存到指定文件
  377. SaveImage(bitmap, ThumbnailImagePath,
  378. GetCodecInfo((string)htmimes[sExt]));
  379. }
  380. catch (System.Exception e)
  381. {
  382. throw e;
  383. }
  384. }
  385. #endregion
  386. }
  387. //测试代码
  388. private void button1_Click(object sender, EventArgs e)
  389. {
  390. string path = @"C:\pics\input\Goolge.png";
  391. string savepath = @"C:\pics\input\Goolge2.png";
  392. string thumpath = @"C:\pics\input\Goolge3.png";
  393. ImageWaterMark imgwm = new ImageWaterMark();
  394. Position ps = new Position();
  395. imgwm.addWaterMark(path, savepath, WaterMarkType.TextMark, "SHW",ps.WM_TOP_RIGHT);
  396. //imgwm.addWaterMark(path, savepath, WaterMarkType.TextMark,"SHW");
  397. //imgwm.ToThumbnailImages(path, thumpath, 50);
  398. }
  399. }

C#为图片添加水印,生成缩略图相关推荐

  1. WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)

    WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能. 下面仅需两段函数代码即可彻底禁用该功能. ...

  2. java生成缩略图,接收图片,按指定宽高或按比例生成缩略图

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java生成缩略图,接收图片,按指定宽高或按比例生成缩略图,能有效降低前端访问图片的流量负载. 支持的图片类型 : [BMP, bmp, jpg, ...

  3. java图片裁剪和java生成缩略图

    一.缩略图 在浏览相册的时候,可能需要生成相应的缩略图. 直接上代码: public class ImageUtil {private Logger log = LoggerFactory.getLo ...

  4. java将图片转成缩略图,将图片生成缩略图Java代码实现

    在工作中经常会遇到图片处理相关的需求,比如说一些图片网站只展示相关的缩略图,而真实的图片可能很大而不是直接展示.所以就需要在上传相关的图片后直接对图片进行处理生成相关的缩略图.实现代码如下: impo ...

  5. java 上传图片 生成缩略图_将图片生成缩略图Java代码实现

    在工作中经常会遇到图片处理相关的需求,比如说一些图片网站只展示相关的缩略图,而真实的图片可能很大而不是直接展示.所以就需要在上传相关的图片后直接对图片进行处理生成相关的缩略图.实现代码如下: impo ...

  6. nginx利用image_filter动态生成缩略图

    2019独角兽企业重金招聘Python工程师标准>>> "我现在是有些图片需要生成缩略图,这个现在加了image_filter这个已经实现了,但我不知道怎么样才能访问我上传 ...

  7. 运用tp5上传图片,并生成缩略图

    最近想做个相册,需要用到上传图像,并且考虑到性能问题,还要生成缩略图,就学习下.在网上看了很多大神写的文章,经过各种调试总算出来了,分享下.不好之处,多多指教 ​ ​ ps:运用tp5图片类生成缩略图 ...

  8. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

  9. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php

    // **************************************** // // 功能:给图片添加水印(支持中文)并生成缩略图 // 参数: $srcFile 图片文件名 // $d ...

最新文章

  1. 安装R语言开发环境RStudio服务器版
  2. 第二章 数组名是一个指针常量吗?
  3. 好文转载—为程序员量身定制的12个目标
  4. axis2+myeclipse6.5环境搭建
  5. java验证cron表达式_cron表达式
  6. java ajax传值到后台_java ajax发送数据到后台,中文乱码
  7. java 静态方法 非静态变量_深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!...
  8. 2014-10-18 多玩初面
  9. iphone手机投屏到电脑 苹果手机不知道的功能
  10. ruoyi 若依 VUE 宝塔 Nignx部署 伪静态配置
  11. win的反义词_英语中最常见 反义词、近义词、同义词及词形转换。欢迎大家收藏...
  12. Linux系统的应用软件流程图绘制软件yEd
  13. 计算机游戏 英文作文,电脑游戏英语作文
  14. 计算机班级学生分析,【本班学生学业成绩状况】_本班学生情况分析报告
  15. 面试平安科技--二面
  16. hook系统调用(一):爬取MSDN官网上的API调用并改为自己的API(c++正则表达式的应用)
  17. 2020电子设计大赛E题复盘
  18. matlab 逐步回归代码,(最新整理)逐步回归matlab程序
  19. 不同的国家,珠峰的高度为啥不一样?
  20. 百世快递 java研发_百世快递2019前景如何(百世快递特别慢的原因)

热门文章

  1. Android仿淘宝历史搜索效果
  2. 《Natural Language Processing with Python》读书笔记 002期
  3. c语言 'max' : undeclared identifier,函数调用老是error C2065: 'getmax' : undeclared identifier怎么处理...
  4. Android 集成阿里云移动推送
  5. selenium学习-----tag name定位一组元素
  6. vivo2020春招笔试编程题(下)
  7. React的受控组件和非受控组件介绍
  8. 夜神MUMU模拟器找不到开发者选项
  9. Java异常机制的最佳实践
  10. php h5 区别,php和h5区别