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();
}
}
}