123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- using Masuit.Tools.Systems;
- using SixLabors.ImageSharp;
- using SixLabors.ImageSharp.PixelFormats;
- using SixLabors.ImageSharp.Processing;
- using SixLabors.ImageSharp.Processing.Processors.Transforms;
- using System;
- namespace Masuit.Tools.Media
- {
- /// <summary>
- /// 图片处理
- /// </summary>
- public static class ImageUtilities
- {
- #region 判断文件类型是否为WEB格式图片
- /// <summary>
- /// 判断文件类型是否为WEB格式图片
- /// (注:JPG,GIF,BMP,PNG)
- /// </summary>
- /// <param name="contentType">HttpPostedFile.ContentType</param>
- /// <returns>是否为WEB格式图片</returns>
- public static bool IsWebImage(string contentType)
- {
- return contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmpp" || contentType == "image/png";
- }
- #endregion 判断文件类型是否为WEB格式图片
- #region 裁剪图片
- /// <summary>
- /// 裁剪图片 -- 用GDI+
- /// </summary>
- /// <param name="b">原始Bitmap</param>
- /// <param name="rec">裁剪区域</param>
- /// <returns>剪裁后的Bitmap</returns>
- public static Image CutImage(this Image b, Rectangle rec)
- {
- b.Mutate(c => c.Crop(rec));
- return b;
- }
- #endregion 裁剪图片
- #region 裁剪并缩放
- /// <summary>
- /// 裁剪并缩放
- /// </summary>
- /// <param name="bmpp">原始图片</param>
- /// <param name="rec">裁剪的矩形区域</param>
- /// <param name="newWidth">新的宽度</param>
- /// <param name="newHeight">新的高度</param>
- /// <returns>处理以后的图片</returns>
- public static Image CutAndResize(this Image bmpp, Rectangle rec, int newWidth, int newHeight)
- {
- bmpp.Mutate(c => c.Crop(rec).Resize(newWidth, newHeight));
- return bmpp;
- }
- #endregion 裁剪并缩放
- #region 缩略图
- /// <summary>
- /// 生成缩略图
- /// </summary>
- /// <param name="originalImage">原图</param>
- /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
- /// <param name="width">缩略图宽度</param>
- /// <param name="height">缩略图高度</param>
- /// <param name="mode">生成缩略图的方式</param>
- public static void MakeThumbnail(this Image originalImage, string thumbnailPath, int width, int height, ResizeMode mode)
- {
- using var image = originalImage.Clone(c => c.Resize(new ResizeOptions()
- {
- Size = new Size(width, height),
- Mode = mode
- }));
- image.Save(thumbnailPath);
- }
- /// <summary>
- /// 生成缩略图
- /// </summary>
- /// <param name="originalImage">原图</param>
- /// <param name="width">缩略图宽度</param>
- /// <param name="height">缩略图高度</param>
- /// <param name="mode">生成缩略图的方式</param>
- public static Image MakeThumbnail(this Image originalImage, int width, int height, ResizeMode mode)
- {
- return originalImage.Clone(c => c.Resize(new ResizeOptions()
- {
- Size = new Size(width, height),
- Mode = mode
- }));
- }
- #endregion 缩略图
- #region 调整光暗
- /// <summary>
- /// 调整光暗
- /// </summary>
- /// <param name="source">原始图片</param>
- /// <param name="val">增加或减少的光暗值</param>
- public static Image LDPic(this Image source, int val)
- {
- var copy = source.CloneAs<Rgba32>();
- for (var x = 0; x < copy.Width; x++)
- {
- for (var y = 0; y < copy.Height; y++)
- {
- var pixel = copy[x, y];
- var resultR = pixel.R + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
- var resultG = pixel.G + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
- var resultB = pixel.B + val; //x、y是循环次数,后面三个是记录红绿蓝三个值的
- copy[x, y] = new Rgba32(resultR, resultG, resultB);
- }
- }
- return copy;
- }
- #endregion 调整光暗
- #region 反色处理
- /// <summary>
- /// 反色处理
- /// </summary>
- /// <param name="source">原始图片</param>
- public static Image RePic(this Image source)
- {
- var copy = source.CloneAs<Rgba32>();
- for (var x = 0; x < copy.Width; x++)
- {
- for (var y = 0; y < copy.Height; y++)
- {
- var pixel = copy[x, y];
- var resultR = 255 - pixel.R;
- var resultG = 255 - pixel.G;
- var resultB = 255 - pixel.B;
- copy[x, y] = new Rgba32(resultR, resultG, resultB);
- }
- }
- return copy;
- }
- #endregion 反色处理
- #region 浮雕处理
- /// <summary>
- /// 浮雕处理
- /// </summary>
- /// <param name="oldBitmap">原始图片</param>
- public static Image Relief(this Image oldBitmap)
- {
- var copy = oldBitmap.CloneAs<Rgba32>();
- for (int x = 0; x < copy.Width - 1; x++)
- {
- for (int y = 0; y < copy.Height - 1; y++)
- {
- var color1 = copy[x, y];
- var color2 = copy[x + 1, y + 1];
- var r = Math.Abs(color1.R - color2.R + 128);
- var g = Math.Abs(color1.G - color2.G + 128);
- var b = Math.Abs(color1.B - color2.B + 128);
- if (r > 255) r = 255;
- if (r < 0) r = 0;
- if (g > 255) g = 255;
- if (g < 0) g = 0;
- if (b > 255) b = 255;
- if (b < 0) b = 0;
- copy[x, y] = new Rgba32(r, b, b);
- }
- }
- return copy;
- }
- #endregion 浮雕处理
- #region 拉伸图片
- /// <summary>
- /// 拉伸图片
- /// </summary>
- /// <param name="image">原始图片</param>
- /// <param name="newW">新的宽度</param>
- /// <param name="newH">新的高度</param>
- public static Image ResizeImage(this Image image, int newW, int newH)
- {
- image.Mutate(c => c.Resize(new ResizeOptions()
- {
- Size = new Size(newW, newH),
- Sampler = new BicubicResampler(),
- Mode = ResizeMode.Stretch
- }));
- return image;
- }
- #endregion 拉伸图片
- #region 滤色处理
- /// <summary>
- /// 滤色处理
- /// </summary>
- /// <param name="source">原始图片</param>
- public static Image FilPic(this Image source)
- {
- var copy = source.CloneAs<Rgba32>();
- for (var x = 0; x < copy.Width; x++)
- {
- for (var y = 0; y < copy.Height; y++)
- {
- copy[x, y] = new Rgba32(0, copy[x, y].G, copy[x, y].B);
- }
- }
- return copy;
- }
- #endregion 滤色处理
- #region 左右翻转
- /// <summary>
- /// 左右翻转
- /// </summary>
- /// <param name="source">原始图片</param>
- public static Image RevPicLR(this Image source)
- {
- source.Mutate(c => c.Flip(FlipMode.Horizontal));
- return source;
- }
- #endregion 左右翻转
- #region 上下翻转
- /// <summary>
- /// 上下翻转
- /// </summary>
- /// <param name="source">原始图片</param>
- public static Image RevPicUD(this Image source)
- {
- source.Mutate(c => c.Flip(FlipMode.Vertical));
- return source;
- }
- #endregion 上下翻转
- #region 灰度化
- /// <summary>
- /// 色彩灰度化
- /// </summary>
- /// <param name="c">输入颜色</param>
- /// <returns>输出颜色</returns>
- public static Color Gray(this Color c)
- {
- var pixel = c.ToPixel<Rgba32>();
- byte rgb = Convert.ToByte(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
- return Color.FromRgb(rgb, rgb, rgb);
- }
- /// <summary>
- /// 色彩灰度化
- /// </summary>
- /// <param name="c">输入颜色</param>
- /// <returns>输出颜色</returns>
- public static Color Reverse(this Color c)
- {
- var pixel = c.ToPixel<Rgba32>();
- byte w = 255;
- return Color.FromRgba((byte)(w - pixel.R), (byte)(w - pixel.G), (byte)(w - pixel.B), pixel.A);
- }
- #endregion 灰度化
- #region 转换为黑白图片
- /// <summary>
- /// 转换为黑白图片
- /// </summary>
- /// <param name="source">要进行处理的图片</param>
- /// <param name="width">图片的长度</param>
- /// <param name="height">图片的高度</param>
- public static Image BWPic(this Image source, int width, int height)
- {
- source.Mutate(c => c.Resize(new ResizeOptions()
- {
- Size = new Size
- {
- Width = width,
- Height = height
- },
- Mode = ResizeMode.Pad,
- Sampler = new BicubicResampler()
- }).BlackWhite());
- return source;
- }
- #endregion 转换为黑白图片
- #region 获取图片中的各帧
- /// <summary>
- /// 获取gif图片中的各帧
- /// </summary>
- /// <param name="gif">源gif</param>
- /// <param name="pSavedPath">保存路径</param>
- public static void GetFrames(this Image gif, string pSavedPath)
- {
- for (var i = 0; i < gif.Frames.Count; i++)
- {
- gif.Frames.ExportFrame(i).Save(pSavedPath + "\\frame_" + i + ".jpg");
- }
- }
- #endregion 获取图片中的各帧
- /// <summary>
- /// 将dataUri保存为图片
- /// </summary>
- /// <param name="source">dataUri数据源</param>
- /// <returns></returns>
- /// <exception cref="Exception">操作失败。</exception>
- public static Image SaveDataUriAsImageFile(this string source)
- {
- string strbase64 = source.Substring(source.IndexOf(',') + 1).Trim('\0');
- byte[] arr = Convert.FromBase64String(strbase64);
- var ms = new PooledMemoryStream(arr);
- return Image.Load(ms);
- }
- }
- }
|