117 lines
4.4 KiB
C#
117 lines
4.4 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Drawing.Text;
|
|
using OpenCvSharp;
|
|
using OpenCvSharp.Extensions;
|
|
using Size = OpenCvSharp.Size;
|
|
using Point = OpenCvSharp.Point;
|
|
|
|
namespace Com.Lmc.ShuiYin.One.Util
|
|
{
|
|
public class Utils
|
|
{
|
|
public static Mat Read(string image, int type)
|
|
{
|
|
// Map Java CV_8S (1) -> Color, CV_8U (0) -> Grayscale
|
|
ImreadModes mode = ImreadModes.Unchanged;
|
|
if (type == 1) mode = ImreadModes.Color;
|
|
else if (type == 0) mode = ImreadModes.Grayscale;
|
|
else mode = (ImreadModes)type;
|
|
|
|
Mat src = Cv2.ImRead(image, mode);
|
|
if (src.Empty())
|
|
{
|
|
Console.WriteLine("File not found!");
|
|
Environment.Exit(-1);
|
|
}
|
|
return src;
|
|
}
|
|
|
|
public static void Show(Mat mat)
|
|
{
|
|
Cv2.ImShow("Utils", mat);
|
|
Cv2.WaitKey(0);
|
|
}
|
|
|
|
public static Mat OptimalDft(Mat srcImg)
|
|
{
|
|
Mat padded = new Mat();
|
|
int opRows = Cv2.GetOptimalDFTSize(srcImg.Rows);
|
|
int opCols = Cv2.GetOptimalDFTSize(srcImg.Cols);
|
|
Cv2.CopyMakeBorder(srcImg, padded, 0, opRows - srcImg.Rows,
|
|
0, opCols - srcImg.Cols, BorderTypes.Constant, Scalar.All(0));
|
|
return padded;
|
|
}
|
|
|
|
public static bool IsAscii(string str)
|
|
{
|
|
foreach (char c in str)
|
|
{
|
|
if (c > 127) // Simple ASCII check
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static Mat DrawNonAscii(string watermark)
|
|
{
|
|
// Create a dummy bitmap to measure string
|
|
using (Bitmap dummy = new Bitmap(1, 1))
|
|
using (Graphics gDummy = Graphics.FromImage(dummy))
|
|
{
|
|
Font font = new Font("Arial", 64, FontStyle.Regular, GraphicsUnit.Pixel);
|
|
// In Java code: Font font = new Font("Default", Font.PLAIN, 64);
|
|
// "Default" might not exist in Windows fonts, usually maps to Dialog or SansSerif.
|
|
// I'll use "Arial" or generic SansSerif.
|
|
|
|
SizeF size = gDummy.MeasureString(watermark, font);
|
|
int width = (int)Math.Ceiling(size.Width);
|
|
int height = (int)Math.Ceiling(size.Height);
|
|
|
|
// Create actual bitmap
|
|
Bitmap bufferedImage = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
// Java uses TYPE_BYTE_GRAY, but System.Drawing doesn't support drawing to 8bpp easily.
|
|
// We will draw to RGB and convert to Gray later or let OpenCV handle it.
|
|
|
|
using (Graphics graphics = Graphics.FromImage(bufferedImage))
|
|
{
|
|
graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
|
|
graphics.CompositingQuality = CompositingQuality.HighQuality;
|
|
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|
|
|
graphics.Clear(Color.Black); // Assuming background is black? Java code says `new BufferedImage`. Default is 0 (black).
|
|
// Java code: graphics.setColor(Color.WHITE); graphics.drawString(watermark, 0, metrics.getAscent());
|
|
|
|
graphics.DrawString(watermark, font, Brushes.White, 0, 0);
|
|
}
|
|
|
|
// Convert to Mat
|
|
Mat res = BitmapConverter.ToMat(bufferedImage);
|
|
// Convert to grayscale CV_8U
|
|
Cv2.CvtColor(res, res, ColorConversionCodes.BGR2GRAY);
|
|
|
|
Cv2.ImWrite("C:\\tools\\shuiyin.png", res); // Keep path as requested
|
|
return res;
|
|
}
|
|
}
|
|
|
|
public static void FixSize(Mat src, Mat mirror)
|
|
{
|
|
if (src.Rows != mirror.Rows)
|
|
{
|
|
Cv2.CopyMakeBorder(src, src, 0, mirror.Rows - src.Rows,
|
|
0, 0, BorderTypes.Constant, Scalar.All(0));
|
|
}
|
|
if (src.Cols != mirror.Cols)
|
|
{
|
|
Cv2.CopyMakeBorder(src, src, 0, 0,
|
|
0, mirror.Cols - src.Cols, BorderTypes.Constant, Scalar.All(0));
|
|
}
|
|
}
|
|
}
|
|
}
|