detect/detect.gui/Services/OCRService.cs
2025-04-23 15:55:51 +08:00

295 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Text.Unicode;
using System.Threading.Tasks;
using detect.gui.Models;
using PaddleOCRSharp;
namespace detect.gui.Services;
public class OCRService
{
// private static OCRService? _instance;
//
// public static OCRService Instance()
// {
// return _instance ??= new OCRService();
// }
private readonly PaddleOCREngine? _engine;
public OCRService()
{
OCRModelConfig? config = null;
var parameter = new OCRParameter();
_engine = new PaddleOCREngine(config, parameter);
}
private ApiResponse<string?> ImportImageOCR(string base64ImageString)
{
// var fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
// fileName = GetImage(base64ImageString, fileName);
var result = "";
// using (var ocrEngine = new TesseractEngine(@".", "chi_sim", EngineMode.Default))
// {
// using (var img = Pix.LoadFromFile(fileName))
// {
// using (var page = ocrEngine.Process(img))
// {
// var text = page.GetText().Replace("\n\n", "");
// var start = text.IndexOf('\n');
// if (start < 0) return new ApiResponse<string?>(0, "success", result);
// text = text.Substring(start).Replace("”", "").Replace("|", "");
// while (text.Contains(" "))
// {
// text = text.Replace(" ", " ");
// }
//
// var lines = text.Split('\n');
// var data = new List<dynamic>();
// foreach (var line in lines)
// {
// if (string.IsNullOrWhiteSpace(line)) continue;
// var items = line.Split(" ");
// try
// {
// data.Add(new
// {
// code = ReplaceChars(items[1]),
// type = ReplaceChars(items[2]),
// x = ReplaceChars(items[3]),
// y = ReplaceChars(items[4]),
// center = ReplaceChars(items[5]),
// w = ReplaceChars(items[2].Split("x")[0]),
// h = ReplaceChars(items[2].Split("x")[1]),
// });
// }
// catch
// {
// }
// }
//
// if (data.Count > 0)
// result = JsonSerializer.Serialize(data,
// new JsonSerializerOptions
// { WriteIndented = true, Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) });
// }
// }
// }
return new ApiResponse<string?>(0, "success", result);
}
public Task<string> ImportByOCR(string base64ImageString)
{
return Task.Run(() =>
{
// var fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
// fileName = GetImage(base64ImageString, fileName);
// var result = _engine?.DetectText(new Bitmap(fileName));
var image = GetImage(base64ImageString);
if (image is null) return "";
var result = _engine?.DetectText(image);
if (result == null) return "";
var resultList = JsonHelper.DeserializeObject<List<OCRResultEntity>>(result.JsonText);
resultList = resultList.Select((d, index) =>
{
d.Index = index;
return d;
}).ToList();
// var items = resultList.Where(d => !string.IsNullOrEmpty(d.Text) && d.Text.ToUpper().Contains("定位信息表")).ToList();
// if (items.Any() && !string.IsNullOrEmpty(items.First().Text))
// {
// wallCode = items.First().Text!.Replace("定位信息表", "").Replace("预埋件", "").Replace("墙", "");
// }
// var tempList = new List<OCRResultEntity>();
// if (!string.IsNullOrWhiteSpace(wallCode))
// {
// tempList = resultList.Where(d => !string.IsNullOrEmpty(d.Text) && d.Text.ToUpper().Contains(wallCode.ToUpper())).ToList();
// }
// else
// {
var tempList = resultList.Where(d => !string.IsNullOrEmpty(d.Text) &&
(d.Text.ToUpper().Contains("PA") ||
d.Text.ToUpper().Contains("PB") ||
d.Text.ToUpper().Contains("PC") ||
d.Text.ToUpper().Contains("PD") ||
d.Text.ToUpper().Contains("PE") ||
d.Text.ToUpper().Contains("PF") ||
d.Text.ToUpper().Contains("PG") ||
d.Text.ToUpper().Contains("PH") ||
d.Text.ToUpper().Contains("PI") ||
d.Text.ToUpper().Contains("PJ") ||
d.Text.ToUpper().Contains("PK") ||
d.Text.ToUpper().Contains("PL") ||
d.Text.ToUpper().Contains("PM") ||
d.Text.ToUpper().Contains("PN") ||
d.Text.ToUpper().Contains("PO") ||
d.Text.ToUpper().Contains("PP") ||
d.Text.ToUpper().Contains("PO") ||
d.Text.ToUpper().Contains("PR") ||
d.Text.ToUpper().Contains("PS") ||
d.Text.ToUpper().Contains("PT") ||
d.Text.ToUpper().Contains("PU") ||
d.Text.ToUpper().Contains("PV") ||
d.Text.ToUpper().Contains("PW") ||
d.Text.ToUpper().Contains("PX") ||
d.Text.ToUpper().Contains("PY") ||
d.Text.ToUpper().Contains("PZ") ||
d.Text.ToUpper().Contains("VB") ||
d.Text.ToUpper().Contains("BS")))
.ToList();
// }
var data = new List<dynamic>();
foreach (var item in tempList)
{
try
{
var w = "0";
var h = "0";
var type = ReplaceChars(resultList[item.Index + 1].Text);
if (string.IsNullOrWhiteSpace(type)) continue;
// if (type.Contains('P', StringComparison.CurrentCultureIgnoreCase) && type.Contains('L', StringComparison.CurrentCultureIgnoreCase))
// {
type = Regex.Replace(type, "[A-Z]", string.Empty);
if (type.Contains('-', StringComparison.CurrentCultureIgnoreCase))
{
type = type.Split("-")[0];
if (type.Contains('x', StringComparison.CurrentCultureIgnoreCase))
{
w = type.Split("x")[0];
h = type.Split("x")[1];
}
else
{
w = type;
h = type;
}
}
else if (type.Contains('x', StringComparison.CurrentCultureIgnoreCase))
{
w = type.Split("x")[0];
h = type.Split("x")[1];
}
else
continue;
// }
// else
// {
// w = type.Split("x")[1];
// h = type.Split("x")[0];
// }
data.Add(new
{
sn = ReplaceChars(resultList[item.Index - 1].Text),
code = ReplaceChars(resultList[item.Index].Text),
type = ReplaceChars(resultList[item.Index + 1].Text),
x = ReplaceChars(resultList[item.Index + 2].Text),
y = ReplaceChars(resultList[item.Index + 3].Text),
center = ReplaceChars(resultList[item.Index + 4].Text),
w = w,
h = h,
// w = ReplaceChars(resultList[item.Index + 1].Text).Split("x")[1],
// h = ReplaceChars(resultList[item.Index + 1].Text).Split("x")[0],
angle = ReplaceChars(resultList[item.Index + 5].Text),
});
}
catch
{
// data.Add(new
// {
// sn = "",
// code = "",
// type = "",
// x = "0",
// y = "0",
// center = "0",
// w = "0",
// h = "0",
// angle = "0",
// });
}
}
return data.Count > 0
? JsonSerializer.Serialize(data,
new JsonSerializerOptions
{ WriteIndented = true, Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) })
: "";
});
}
private string ReplaceChars(string? text)
{
return string.IsNullOrEmpty(text) ? "" : text.Replace("\u00d7", "x").Replace("_", "").Replace(",", "").Replace(":", "").Replace(";", "").Replace(" ", "").Replace("", "");
}
private Image? GetImage(string base64ImageString)
{
var imageType = System.Drawing.Imaging.ImageFormat.Gif;
if (base64ImageString.IndexOf("data:image/jpeg", StringComparison.Ordinal) >= 0)
{
imageType = System.Drawing.Imaging.ImageFormat.Jpeg;
base64ImageString = base64ImageString.Replace("data:image/jpeg;base64,", "");
// fileName += ".jpg";
}
if (base64ImageString.IndexOf("data:image/png", StringComparison.Ordinal) >= 0)
{
imageType = System.Drawing.Imaging.ImageFormat.Png;
base64ImageString = base64ImageString.Replace("data:image/png;base64,", "");
// fileName += ".png";
}
if (base64ImageString.IndexOf("data:image/bmp", StringComparison.Ordinal) >= 0)
{
imageType = System.Drawing.Imaging.ImageFormat.Bmp;
base64ImageString = base64ImageString.Replace("data:image/bmp;base64,", "");
// fileName += ".bmp";
}
if (Equals(imageType, System.Drawing.Imaging.ImageFormat.Gif))
{
return null;
}
try
{
var imageBytes = Convert.FromBase64String(base64ImageString.Replace("data:image/jpeg;base64,", ""));
using var ms = new MemoryStream(imageBytes);
var image = System.Drawing.Image.FromStream(ms);
using var bmpStream = new MemoryStream();
image.Save(bmpStream, imageType);
// var bmpBytes = bmpStream.ToArray();
// File.WriteAllBytes(fileName, bmpBytes);
return image;
// image.Dispose();
// return fileName;
}
catch
{
return null;
}
}
public class OCRResultEntity
{
public int Index { get; set; }
public List<BoxPoint>? BoxPoints { get; set; }
public double Score { get; set; }
public string? Text { get; set; }
public int cls_label { get; set; }
public double cls_score { get; set; }
}
public class BoxPoint
{
public int X { get; set; }
public int Y { get; set; }
}
}