using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Drawing; using System.IO; namespace DaJiaoYan.Utils { internal class ImageUtils { internal static Mat Read(string filename, ImreadModes mode = ImreadModes.AnyColor) { var res = Cv2.ImRead(filename, mode); if (res == null || res.Width < 1 || res.Height < 1) { // 判断图片异常 try { Bitmap bitmap = new Bitmap(filename); res = ToMat(bitmap); } catch { } } return res; } /// /// image 转 mat /// /// /// internal static Mat ToMat(Image image) { Mat mat = null; if (image != null) { Bitmap bmp = new Bitmap(image); mat = BitmapConverter.ToMat(bmp); bmp.Dispose(); } return mat; } /// /// 从 stream 转 mat /// /// /// internal static Mat ToMat(Stream stream) { Mat mat = null; if (stream != null && stream.Length > 0) { mat = Mat.FromStream(stream, ImreadModes.AnyColor); } return mat; } /// /// 转Base64 /// /// /// internal static string ToBase64(string filename) { string res = ""; try { using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); res = Convert.ToBase64String(buffer); } } catch { } return res; } internal static void Red2OtherColor(ref Mat img, Scalar scalar, int minThreshold = 10, int maxThreshold = 40) { Cv2.CvtColor(img, img, ColorConversionCodes.BGR2HSV); Mat mask0 = new Mat(), mask1 = new Mat(), mask; Cv2.InRange(img, new Mat(1, 3, MatType.CV_32S, new Scalar(0, maxThreshold, maxThreshold)), new Mat(1, 3, MatType.CV_32S, new Scalar(minThreshold, 255, 255)), mask0); Cv2.InRange(img, new Mat(1, 3, MatType.CV_32S, new Scalar(150, maxThreshold, maxThreshold)), new Mat(1, 3, MatType.CV_32S, new Scalar(180, 255, 255)), mask1); mask = mask0 + mask1; Cv2.CvtColor(img, img, ColorConversionCodes.HSV2BGR); img.SetTo(scalar, mask); mask0?.Dispose(); mask1?.Dispose(); mask?.Dispose(); } } }