ImageUtilities.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using Masuit.Tools.Systems;
  2. using SixLabors.ImageSharp;
  3. using SixLabors.ImageSharp.PixelFormats;
  4. using SixLabors.ImageSharp.Processing;
  5. using SixLabors.ImageSharp.Processing.Processors.Transforms;
  6. using System;
  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. using var image = originalImage.Clone(c => c.Resize(new ResizeOptions()
  66. {
  67. Size = new Size(width, height),
  68. Mode = mode
  69. }));
  70. image.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. return originalImage.Clone(c => c.Resize(new ResizeOptions()
  82. {
  83. Size = new Size(width, height),
  84. Mode = mode
  85. }));
  86. }
  87. #endregion 缩略图
  88. #region 调整光暗
  89. /// <summary>
  90. /// 调整光暗
  91. /// </summary>
  92. /// <param name="source">原始图片</param>
  93. /// <param name="val">增加或减少的光暗值</param>
  94. public static Image LDPic(this Image source, int val)
  95. {
  96. var copy = source.CloneAs<Rgba32>();
  97. for (var x = 0; x < copy.Width; x++)
  98. {
  99. for (var y = 0; y < copy.Height; y++)
  100. {
  101. var pixel = copy[x, y];
  102. var resultR = pixel.R + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  103. var resultG = pixel.G + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  104. var resultB = pixel.B + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
  105. copy[x, y] = new Rgba32(resultR, resultG, resultB);
  106. }
  107. }
  108. return copy;
  109. }
  110. #endregion 调整光暗
  111. #region 反色处理
  112. /// <summary>
  113. /// 反色处理
  114. /// </summary>
  115. /// <param name="source">原始图片</param>
  116. public static Image RePic(this Image source)
  117. {
  118. var copy = source.CloneAs<Rgba32>();
  119. for (var x = 0; x < copy.Width; x++)
  120. {
  121. for (var y = 0; y < copy.Height; y++)
  122. {
  123. var pixel = copy[x, y];
  124. var resultR = 255 - pixel.R;
  125. var resultG = 255 - pixel.G;
  126. var resultB = 255 - pixel.B;
  127. copy[x, y] = new Rgba32(resultR, resultG, resultB);
  128. }
  129. }
  130. return copy;
  131. }
  132. #endregion 反色处理
  133. #region 浮雕处理
  134. /// <summary>
  135. /// 浮雕处理
  136. /// </summary>
  137. /// <param name="oldBitmap">原始图片</param>
  138. public static Image Relief(this Image oldBitmap)
  139. {
  140. var copy = oldBitmap.CloneAs<Rgba32>();
  141. for (int x = 0; x < copy.Width - 1; x++)
  142. {
  143. for (int y = 0; y < copy.Height - 1; y++)
  144. {
  145. var color1 = copy[x, y];
  146. var color2 = copy[x + 1, y + 1];
  147. var r = Math.Abs(color1.R - color2.R + 128);
  148. var g = Math.Abs(color1.G - color2.G + 128);
  149. var b = Math.Abs(color1.B - color2.B + 128);
  150. if (r > 255) r = 255;
  151. if (r < 0) r = 0;
  152. if (g > 255) g = 255;
  153. if (g < 0) g = 0;
  154. if (b > 255) b = 255;
  155. if (b < 0) b = 0;
  156. copy[x, y] = new Rgba32(r, b, b);
  157. }
  158. }
  159. return copy;
  160. }
  161. #endregion 浮雕处理
  162. #region 拉伸图片
  163. /// <summary>
  164. /// 拉伸图片
  165. /// </summary>
  166. /// <param name="image">原始图片</param>
  167. /// <param name="newW">新的宽度</param>
  168. /// <param name="newH">新的高度</param>
  169. public static Image ResizeImage(this Image image, int newW, int newH)
  170. {
  171. image.Mutate(c => c.Resize(new ResizeOptions()
  172. {
  173. Size = new Size(newW, newH),
  174. Sampler = new BicubicResampler(),
  175. Mode = ResizeMode.Stretch
  176. }));
  177. return image;
  178. }
  179. #endregion 拉伸图片
  180. #region 滤色处理
  181. /// <summary>
  182. /// 滤色处理
  183. /// </summary>
  184. /// <param name="source">原始图片</param>
  185. public static Image FilPic(this Image source)
  186. {
  187. var copy = source.CloneAs<Rgba32>();
  188. for (var x = 0; x < copy.Width; x++)
  189. {
  190. for (var y = 0; y < copy.Height; y++)
  191. {
  192. copy[x, y] = new Rgba32(0, copy[x, y].G, copy[x, y].B);
  193. }
  194. }
  195. return copy;
  196. }
  197. #endregion 滤色处理
  198. #region 左右翻转
  199. /// <summary>
  200. /// 左右翻转
  201. /// </summary>
  202. /// <param name="source">原始图片</param>
  203. public static Image RevPicLR(this Image source)
  204. {
  205. source.Mutate(c => c.Flip(FlipMode.Horizontal));
  206. return source;
  207. }
  208. #endregion 左右翻转
  209. #region 上下翻转
  210. /// <summary>
  211. /// 上下翻转
  212. /// </summary>
  213. /// <param name="source">原始图片</param>
  214. public static Image RevPicUD(this Image source)
  215. {
  216. source.Mutate(c => c.Flip(FlipMode.Vertical));
  217. return source;
  218. }
  219. #endregion 上下翻转
  220. #region 灰度化
  221. /// <summary>
  222. /// 色彩灰度化
  223. /// </summary>
  224. /// <param name="c">输入颜色</param>
  225. /// <returns>输出颜色</returns>
  226. public static Color Gray(this Color c)
  227. {
  228. var pixel = c.ToPixel<Rgba32>();
  229. byte rgb = Convert.ToByte(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
  230. return Color.FromRgb(rgb, rgb, rgb);
  231. }
  232. /// <summary>
  233. /// 色彩灰度化
  234. /// </summary>
  235. /// <param name="c">输入颜色</param>
  236. /// <returns>输出颜色</returns>
  237. public static Color Reverse(this Color c)
  238. {
  239. var pixel = c.ToPixel<Rgba32>();
  240. byte w = 255;
  241. return Color.FromRgba((byte)(w - pixel.R), (byte)(w - pixel.G), (byte)(w - pixel.B), pixel.A);
  242. }
  243. #endregion 灰度化
  244. #region 转换为黑白图片
  245. /// <summary>
  246. /// 转换为黑白图片
  247. /// </summary>
  248. /// <param name="source">要进行处理的图片</param>
  249. /// <param name="width">图片的长度</param>
  250. /// <param name="height">图片的高度</param>
  251. public static Image BWPic(this Image source, int width, int height)
  252. {
  253. source.Mutate(c => c.Resize(new ResizeOptions()
  254. {
  255. Size = new Size
  256. {
  257. Width = width,
  258. Height = height
  259. },
  260. Mode = ResizeMode.Pad,
  261. Sampler = new BicubicResampler()
  262. }).BlackWhite());
  263. return source;
  264. }
  265. #endregion 转换为黑白图片
  266. #region 获取图片中的各帧
  267. /// <summary>
  268. /// 获取gif图片中的各帧
  269. /// </summary>
  270. /// <param name="gif">源gif</param>
  271. /// <param name="pSavedPath">保存路径</param>
  272. public static void GetFrames(this Image gif, string pSavedPath)
  273. {
  274. for (var i = 0; i < gif.Frames.Count; i++)
  275. {
  276. gif.Frames.ExportFrame(i).Save(pSavedPath + "\\frame_" + i + ".jpg");
  277. }
  278. }
  279. #endregion 获取图片中的各帧
  280. /// <summary>
  281. /// 将dataUri保存为图片
  282. /// </summary>
  283. /// <param name="source">dataUri数据源</param>
  284. /// <returns></returns>
  285. /// <exception cref="Exception">操作失败。</exception>
  286. public static Image SaveDataUriAsImageFile(this string source)
  287. {
  288. string strbase64 = source.Substring(source.IndexOf(',') + 1).Trim('\0');
  289. byte[] arr = Convert.FromBase64String(strbase64);
  290. var ms = new PooledMemoryStream(arr);
  291. return Image.Load(ms);
  292. }
  293. }
  294. }