ImageUtilities.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. using System;
  2. using System.IO;
  3. using SixLabors.ImageSharp;
  4. using SixLabors.ImageSharp.PixelFormats;
  5. using SixLabors.ImageSharp.Processing;
  6. using SixLabors.ImageSharp.Processing.Processors.Transforms;
  7. namespace Masuit.Tools.Media
  8. {
  9. /// <summary>
  10. /// 图片处理
  11. /// </summary>
  12. public static class ImageUtilities
  13. {
  14. #region 判断文件类型是否为WEB格式图片
  15. /// <summary>
  16. /// 判断文件类型是否为WEB格式图片
  17. /// (注:JPG,GIF,BMP,PNG)
  18. /// </summary>
  19. /// <param name="contentType">HttpPostedFile.ContentType</param>
  20. /// <returns>是否为WEB格式图片</returns>
  21. public static bool IsWebImage(string contentType)
  22. {
  23. return contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmpp" || contentType == "image/png";
  24. }
  25. #endregion 判断文件类型是否为WEB格式图片
  26. #region 裁剪图片
  27. /// <summary>
  28. /// 裁剪图片 -- 用GDI+
  29. /// </summary>
  30. /// <param name="b">原始Bitmap</param>
  31. /// <param name="rec">裁剪区域</param>
  32. /// <returns>剪裁后的Bitmap</returns>
  33. public static Image CutImage(this Image b, Rectangle rec)
  34. {
  35. b.Mutate(c => c.Crop(rec));
  36. return b;
  37. }
  38. #endregion 裁剪图片
  39. #region 裁剪并缩放
  40. /// <summary>
  41. /// 裁剪并缩放
  42. /// </summary>
  43. /// <param name="bmpp">原始图片</param>
  44. /// <param name="rec">裁剪的矩形区域</param>
  45. /// <param name="newWidth">新的宽度</param>
  46. /// <param name="newHeight">新的高度</param>
  47. /// <returns>处理以后的图片</returns>
  48. public static Image CutAndResize(this Image bmpp, Rectangle rec, int newWidth, int newHeight)
  49. {
  50. bmpp.Mutate(c => c.Crop(rec).Resize(newWidth, newHeight));
  51. return bmpp;
  52. }
  53. #endregion 裁剪并缩放
  54. #region 缩略图
  55. /// <summary>
  56. /// 生成缩略图
  57. /// </summary>
  58. /// <param name="originalImage">原图</param>
  59. /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
  60. /// <param name="width">缩略图宽度</param>
  61. /// <param name="height">缩略图高度</param>
  62. /// <param name="mode">生成缩略图的方式</param>
  63. public static void MakeThumbnail(this Image originalImage, string thumbnailPath, int width, int height, ResizeMode mode)
  64. {
  65. originalImage.Mutate(c => c.Resize(new ResizeOptions()
  66. {
  67. Size = new Size(width, height),
  68. Mode = mode
  69. }));
  70. originalImage.Save(thumbnailPath);
  71. }
  72. /// <summary>
  73. /// 生成缩略图
  74. /// </summary>
  75. /// <param name="originalImage">原图</param>
  76. /// <param name="width">缩略图宽度</param>
  77. /// <param name="height">缩略图高度</param>
  78. /// <param name="mode">生成缩略图的方式</param>
  79. public static Image MakeThumbnail(this Image originalImage, int width, int height, ResizeMode mode)
  80. {
  81. originalImage.Mutate(c => c.Resize(new ResizeOptions()
  82. {
  83. Size = new Size(width, height),
  84. Mode = mode
  85. }));
  86. return originalImage;
  87. }
  88. #endregion 缩略图
  89. #region 调整光暗
  90. /// <summary>
  91. /// 调整光暗
  92. /// </summary>
  93. /// <param name="source">原始图片</param>
  94. /// <param name="val">增加或减少的光暗值</param>
  95. public static Image LDPic(this Image source, int val)
  96. {
  97. var copy = source.CloneAs<Rgba32>();
  98. for (var x = 0; x < copy.Width; x++)
  99. {
  100. for (var y = 0; y < copy.Height; y++)
  101. {
  102. var pixel = copy[x, y];
  103. var resultR = pixel.R + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  104. var resultG = pixel.G + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  105. var resultB = pixel.B + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  106. copy[x, y] = new Rgba32(resultR, resultG, resultB);
  107. }
  108. }
  109. return copy;
  110. }
  111. #endregion 调整光暗
  112. #region 反色处理
  113. /// <summary>
  114. /// 反色处理
  115. /// </summary>
  116. /// <param name="source">原始图片</param>
  117. public static Image RePic(this Image source)
  118. {
  119. var copy = source.CloneAs<Rgba32>();
  120. for (var x = 0; x < copy.Width; x++)
  121. {
  122. for (var y = 0; y < copy.Height; y++)
  123. {
  124. var pixel = copy[x, y];
  125. var resultR = 255 - pixel.R;
  126. var resultG = 255 - pixel.G;
  127. var resultB = 255 - pixel.B;
  128. copy[x, y] = new Rgba32(resultR, resultG, resultB);
  129. }
  130. }
  131. return copy;
  132. }
  133. #endregion 反色处理
  134. #region 浮雕处理
  135. /// <summary>
  136. /// 浮雕处理
  137. /// </summary>
  138. /// <param name="oldBitmap">原始图片</param>
  139. public static Image Relief(this Image oldBitmap)
  140. {
  141. var copy = oldBitmap.CloneAs<Rgba32>();
  142. for (int x = 0; x < copy.Width - 1; x++)
  143. {
  144. for (int y = 0; y < copy.Height - 1; y++)
  145. {
  146. var color1 = copy[x, y];
  147. var color2 = copy[x + 1, y + 1];
  148. var r = Math.Abs(color1.R - color2.R + 128);
  149. var g = Math.Abs(color1.G - color2.G + 128);
  150. var b = Math.Abs(color1.B - color2.B + 128);
  151. if (r > 255) r = 255;
  152. if (r < 0) r = 0;
  153. if (g > 255) g = 255;
  154. if (g < 0) g = 0;
  155. if (b > 255) b = 255;
  156. if (b < 0) b = 0;
  157. copy[x, y] = new Rgba32(r, b, b);
  158. }
  159. }
  160. return copy;
  161. }
  162. #endregion 浮雕处理
  163. #region 拉伸图片
  164. /// <summary>
  165. /// 拉伸图片
  166. /// </summary>
  167. /// <param name="image">原始图片</param>
  168. /// <param name="newW">新的宽度</param>
  169. /// <param name="newH">新的高度</param>
  170. public static Image ResizeImage(this Image image, int newW, int newH)
  171. {
  172. image.Mutate(c => c.Resize(new ResizeOptions()
  173. {
  174. Size = new Size(newW, newH),
  175. Sampler = new BicubicResampler(),
  176. Mode = ResizeMode.Stretch
  177. }));
  178. return image;
  179. }
  180. #endregion 拉伸图片
  181. #region 滤色处理
  182. /// <summary>
  183. /// 滤色处理
  184. /// </summary>
  185. /// <param name="source">原始图片</param>
  186. public static Image FilPic(this Image source)
  187. {
  188. var copy = source.CloneAs<Rgba32>();
  189. for (var x = 0; x < copy.Width; x++)
  190. {
  191. for (var y = 0; y < copy.Height; y++)
  192. {
  193. copy[x, y] = new Rgba32(0, copy[x, y].G, copy[x, y].B);
  194. }
  195. }
  196. return copy;
  197. }
  198. #endregion 滤色处理
  199. #region 左右翻转
  200. /// <summary>
  201. /// 左右翻转
  202. /// </summary>
  203. /// <param name="source">原始图片</param>
  204. public static Image RevPicLR(this Image source)
  205. {
  206. source.Mutate(c => c.Flip(FlipMode.Horizontal));
  207. return source;
  208. }
  209. #endregion 左右翻转
  210. #region 上下翻转
  211. /// <summary>
  212. /// 上下翻转
  213. /// </summary>
  214. /// <param name="source">原始图片</param>
  215. public static Image RevPicUD(this Image source)
  216. {
  217. source.Mutate(c => c.Flip(FlipMode.Vertical));
  218. return source;
  219. }
  220. #endregion 上下翻转
  221. #region 灰度化
  222. /// <summary>
  223. /// 色彩灰度化
  224. /// </summary>
  225. /// <param name="c">输入颜色</param>
  226. /// <returns>输出颜色</returns>
  227. public static Color Gray(this Color c)
  228. {
  229. var pixel = c.ToPixel<Rgba32>();
  230. byte rgb = Convert.ToByte(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
  231. return Color.FromRgb(rgb, rgb, rgb);
  232. }
  233. /// <summary>
  234. /// 色彩灰度化
  235. /// </summary>
  236. /// <param name="c">输入颜色</param>
  237. /// <returns>输出颜色</returns>
  238. public static Color Reverse(this Color c)
  239. {
  240. var pixel = c.ToPixel<Rgba32>();
  241. byte w = 255;
  242. return Color.FromRgba((byte)(w - pixel.R), (byte)(w - pixel.G), (byte)(w - pixel.B), pixel.A);
  243. }
  244. #endregion 灰度化
  245. #region 转换为黑白图片
  246. /// <summary>
  247. /// 转换为黑白图片
  248. /// </summary>
  249. /// <param name="source">要进行处理的图片</param>
  250. /// <param name="width">图片的长度</param>
  251. /// <param name="height">图片的高度</param>
  252. public static Image BWPic(this Image source, int width, int height)
  253. {
  254. source.Mutate(c => c.Resize(new ResizeOptions()
  255. {
  256. Size = new Size
  257. {
  258. Width = width,
  259. Height = height
  260. },
  261. Mode = ResizeMode.Pad,
  262. Sampler = new BicubicResampler()
  263. }).BlackWhite());
  264. return source;
  265. }
  266. #endregion 转换为黑白图片
  267. #region 获取图片中的各帧
  268. /// <summary>
  269. /// 获取gif图片中的各帧
  270. /// </summary>
  271. /// <param name="gif">源gif</param>
  272. /// <param name="pSavedPath">保存路径</param>
  273. public static void GetFrames(this Image gif, string pSavedPath)
  274. {
  275. for (var i = 0; i < gif.Frames.Count; i++)
  276. {
  277. gif.Frames.ExportFrame(i).Save(pSavedPath + "\\frame_" + i + ".jpg");
  278. }
  279. }
  280. #endregion 获取图片中的各帧
  281. /// <summary>
  282. /// 将dataUri保存为图片
  283. /// </summary>
  284. /// <param name="source">dataUri数据源</param>
  285. /// <returns></returns>
  286. /// <exception cref="Exception">操作失败。</exception>
  287. public static Image SaveDataUriAsImageFile(this string source)
  288. {
  289. string strbase64 = source.Substring(source.IndexOf(',') + 1).Trim('\0');
  290. byte[] arr = Convert.FromBase64String(strbase64);
  291. using var ms = new MemoryStream(arr);
  292. return Image.Load(ms);
  293. }
  294. }
  295. }