881 lines
30 KiB
C#
881 lines
30 KiB
C#
using Emgu.CV;
|
|
using Emgu.CV.CvEnum;
|
|
using Emgu.CV.Structure;
|
|
using Emgu.CV.Util;
|
|
using Lucee.WebBase.Data;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using Lucee.WebBase.Utils;
|
|
using System.Net;
|
|
|
|
public partial class Temp_TempDraw : System.Web.UI.Page
|
|
{
|
|
public static BoxType bt = null;
|
|
public long tenant = 0;
|
|
protected void Page_Load(object sender, EventArgs e)
|
|
{
|
|
if (!IsPostBack)
|
|
{
|
|
int action = Convert.ToInt32(Globals.Request("action")==""?0:Convert.ToInt32(Globals.Request("action")));
|
|
if (action == 1) {
|
|
Response.Clear();
|
|
DrawGo();
|
|
Response.End();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private void DrawGo()
|
|
{
|
|
long TempID = Convert.ToInt64(Globals.Request("TempID"));
|
|
long UserID = Convert.ToInt64(Globals.Request("UserID"));
|
|
tenant = Globals.Request("tenant") == "" ? 0 : Convert.ToInt64(Globals.Request("tenant"));
|
|
|
|
//开始阅卷
|
|
//获取主模板ID
|
|
DataTable dt = MK_Data.GetMainTempData(TempID);
|
|
if (dt.Rows.Count > 0)
|
|
{
|
|
//获取机阅基础数据
|
|
bt = MK_Data.GetBoxType(MK_Data.GetMainTempDataMainBoxType(Convert.ToInt32(dt.Rows[0]["MainID_bigint"])));
|
|
string[] GetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$');
|
|
int width = Convert.ToInt32(GetData[6].Split(',')[0]);
|
|
int height = Convert.ToInt32(GetData[6].Split(',')[1]);
|
|
dt = MK_Data.GetMinTempDataUser(TempID, UserID);
|
|
|
|
string imgUrl = Globals.Request("imgUrl");
|
|
Bitmap bmp;
|
|
if (imgUrl == "")
|
|
{
|
|
bmp = new Bitmap(UrlToImage(dt.Rows[0]["TempPicture64_nvarchar"].ToString()));
|
|
}
|
|
else
|
|
{
|
|
bmp = new Bitmap(UrlToImage(imgUrl));
|
|
}
|
|
//还原图片大小,这里可能有逻辑错误
|
|
bmp = MK_Operater.ScaleToSize(bmp, width, height);
|
|
//获取旋转偏移量
|
|
string[] PXGetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$');
|
|
bmp = MK_Operater.ImageRotates(bmp, (float)Convert.ToDouble(dt.Rows[0]["Rotate_float"])).Bitmap;
|
|
//切换模板数据
|
|
dt = MK_Data.GetMainTempData(TempID);
|
|
string[] FinleGetData = dt.Rows[0]["TempValue_nvarchar"].ToString().Split('$');
|
|
FinleGetData[0] = PXGetData[0];
|
|
//斜率
|
|
double xielv = Convert.ToDouble(dt.Rows[0]["XieLv_float"]);
|
|
//原始宽度
|
|
int oldWidth = Convert.ToInt32(dt.Rows[0]["CutWidth_int"]);
|
|
//原始高度
|
|
int oldHeight = Convert.ToInt32(dt.Rows[0]["CutHeight_int"]);
|
|
//原始坐标
|
|
string PYPostionList = dt.Rows[0]["PyPPostion_nvarchar"].ToString();
|
|
//切换执行数组,如果没得定位点就不要覆盖原始数据
|
|
Mat color_mat;
|
|
Mat mat_dilate;
|
|
VectorOfVectorOfPoint selected_contours;
|
|
CommonUse commonUse = new CommonUse();
|
|
string[] PYPostion;
|
|
if (GetData[0] != "")
|
|
{
|
|
string[] postionc = GetData[0].Split('^');
|
|
//pb_image.Image = bmp;
|
|
for (int i = 0; i < postionc.Length; i++)
|
|
{
|
|
string[] postCutList = postionc[i].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(postCutList[0]));
|
|
int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1]));
|
|
int W = Convert.ToInt32(Convert.ToDouble(postCutList[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(postCutList[3]));
|
|
//bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1);
|
|
}
|
|
|
|
GetData = FinleGetData;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//换算未灰度图片 并选取点
|
|
Image<Gray, byte> EmguImagex = new Image<Gray, byte>(bmp);
|
|
Mat mat_threshold = new Mat();
|
|
CvInvoke.Threshold(EmguImagex, mat_threshold, 120, 253, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
|
|
mat_dilate = commonUse.MyDilate(mat_threshold);
|
|
selected_contours = commonUse.GetUsefulContours(mat_dilate, 1);
|
|
|
|
|
|
//color_mat = commonUse.DrawContours(mat_dilate, selected_contours);
|
|
//Response.Write(ImgToBase64String(color_mat.Bitmap));
|
|
//bmp.Dispose();
|
|
//return;
|
|
|
|
|
|
|
|
//获取当前斜率
|
|
float myXielv = MK_Operater.GetPostionXYByFindRoteBmp(EmguImagex.Mat, selected_contours, GetData[0]);
|
|
if (myXielv == -100||myXielv==0)
|
|
{
|
|
Response.Write("-1");
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//同步主图斜率
|
|
float flagxie = ((90 - myXielv) - (90 - (float)xielv));
|
|
//更新图片
|
|
EmguImagex.Bitmap = MK_Operater.ImageRotates(bmp, flagxie).Bitmap;
|
|
//重新查找点阵
|
|
CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
|
|
Mat mat_dilate6 = commonUse.MyDilate(mat_threshold);
|
|
VectorOfVectorOfPoint selected_contours6;
|
|
selected_contours6 = commonUse.GetUsefulContours(mat_dilate6, 1);
|
|
|
|
|
|
//color_mat = EmguImagex.Mat;
|
|
//color_mat = commonUse.DrawContours(color_mat, selected_contours6);
|
|
//Response.Write(ImgToBase64String(color_mat.Bitmap));
|
|
//bmp.Dispose();
|
|
//return;
|
|
|
|
|
|
|
|
|
|
//根据定位点重新裁剪图片
|
|
EmguImagex = MK_Operater.GetPostionXYByFind(EmguImagex.Mat, selected_contours6, GetData[0]);
|
|
if (EmguImagex == null)
|
|
{
|
|
return;
|
|
}
|
|
//等比例同步
|
|
EmguImagex.Bitmap = MK_Operater.ScaleToSize(EmguImagex.Bitmap, oldWidth, oldHeight);
|
|
//下列操作项定位点数据
|
|
PYPostion = PYPostionList.Split(',');
|
|
//最终选取图形
|
|
CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
|
|
mat_dilate = commonUse.MyDilate(mat_threshold);
|
|
selected_contours = commonUse.GetUsefulContoursYueJuan(mat_dilate, 1);
|
|
color_mat = EmguImagex.Mat;
|
|
color_mat = commonUse.DrawContours(color_mat, selected_contours);
|
|
bmp = color_mat.Bitmap;
|
|
}
|
|
else
|
|
{
|
|
PYPostion = "0,0".Split(',');
|
|
Image<Gray, byte> EmguImagex = new Image<Gray, byte>(bmp);
|
|
Mat mat_threshold = new Mat();
|
|
CvInvoke.Threshold(EmguImagex, mat_threshold, bt.Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
|
|
mat_dilate = commonUse.MyDilate(mat_threshold);
|
|
selected_contours = commonUse.GetUsefulContoursYueJuan(mat_dilate, 1);
|
|
color_mat = EmguImagex.Mat;
|
|
color_mat = commonUse.DrawContours(color_mat, selected_contours);
|
|
bmp = color_mat.Bitmap;
|
|
}
|
|
|
|
//如果要取条码
|
|
if (GetData[5] != "")
|
|
{
|
|
string[] tiaomaData = GetData[5].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3]));
|
|
bmp= commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1);
|
|
}
|
|
|
|
//如果要取填涂
|
|
if (GetData[1] != "")
|
|
{
|
|
string[] XuehaoData = GetData[1].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(XuehaoData[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(XuehaoData[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(XuehaoData[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(XuehaoData[3]));
|
|
int num = Convert.ToInt32(Convert.ToDouble(XuehaoData[4]));
|
|
int wL = Convert.ToInt32(W / num);
|
|
int hL = Convert.ToInt32(H / 10);
|
|
bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, num, Y, hL, 10);
|
|
}
|
|
//缺考
|
|
if (GetData[4] != "")
|
|
{
|
|
string[] quekao = GetData[4].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(quekao[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(quekao[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(quekao[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(quekao[3]));
|
|
bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1);
|
|
}
|
|
if (GetData[2] != "")
|
|
{
|
|
string[] keguantiList = GetData[2].Split('^');
|
|
for (int i = 0; i < keguantiList.Length; i++)
|
|
{
|
|
string[] keguanPos = keguantiList[i].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(keguanPos[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(keguanPos[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(keguanPos[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(keguanPos[3]));
|
|
int xuanXiang = Convert.ToInt32(keguanPos[6]);//选项数量
|
|
|
|
|
|
string bigTihao = "";
|
|
if (keguanPos[5].ToUpper().Contains("M")) // 如果存在客观题
|
|
{
|
|
bigTihao = keguanPos[5].ToUpper().Split('M')[0] + "M";
|
|
keguanPos[5] = keguanPos[5].ToUpper().Split('M')[1];
|
|
keguanPos[4] = keguanPos[4].ToUpper().Split('M')[1];
|
|
}
|
|
int tiliang = Convert.ToInt32(keguanPos[5]) - Convert.ToInt32(keguanPos[4]) + 1;//题量
|
|
|
|
|
|
if (keguanPos[7].ToString() == "0")//横向取值
|
|
{
|
|
int wL = Convert.ToInt32(W / xuanXiang);
|
|
int hL = Convert.ToInt32(H / tiliang);
|
|
bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, xuanXiang, Y, hL, tiliang);
|
|
}
|
|
else
|
|
{
|
|
int wL = Convert.ToInt32(W / tiliang);
|
|
int hL = Convert.ToInt32(H / xuanXiang);
|
|
bmp = commonUse.DrawGridByXYDraw(bmp, X, wL, tiliang, Y, hL, xuanXiang);
|
|
}
|
|
}
|
|
}
|
|
if (GetData[3] != "")
|
|
{
|
|
string[] Datalist = GetData[3].Split('^');
|
|
foreach (string postiontiaoma in Datalist)
|
|
{
|
|
string[] tiaomaData = postiontiaoma.Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3]));
|
|
bmp = commonUse.DrawGridByXYDraw(bmp, X, W, 1, Y, H, 1);
|
|
}
|
|
}
|
|
Response.Write(ImgToBase64String(bmp));
|
|
bmp.Dispose();
|
|
}
|
|
|
|
}
|
|
|
|
public static Bitmap UrlToImage(string url)
|
|
{
|
|
WebRequest imgRequest = WebRequest.Create(url);
|
|
|
|
HttpWebResponse res=null;
|
|
try
|
|
{
|
|
res = (HttpWebResponse)imgRequest.GetResponse();
|
|
imgRequest.Timeout = 50000;
|
|
if (res.StatusCode.ToString() == "OK")
|
|
{
|
|
return new Bitmap(imgRequest.GetResponse().GetResponseStream());
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
catch (WebException ex)
|
|
{
|
|
res = (HttpWebResponse)ex.Response;
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
if (res != null) {
|
|
res.Dispose();
|
|
res.Close();
|
|
}
|
|
imgRequest.Abort();
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 检查图片是否空白图片
|
|
/// </summary>
|
|
/// <param name="img">Image</param>
|
|
/// <returns>是否空白图片</returns>
|
|
public static bool CheckTransparentImg(System.Drawing.Image img)
|
|
{
|
|
bool blnIsTransparent = false;
|
|
//加载位图
|
|
Bitmap bitMap = new Bitmap(img);
|
|
//图片总像素
|
|
int intAll = img.Height * img.Width;
|
|
int intCount = 0;
|
|
//按像素遍历
|
|
for (int intY = 0; intY < img.Height; intY++)
|
|
{
|
|
for (int intX = 0; intX < img.Width; intX++)
|
|
{
|
|
if (bitMap.GetPixel(intX, intY).GetBrightness() == 1)
|
|
{
|
|
intCount += 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
float a = (float)intCount / (float)intAll;
|
|
Console.WriteLine(a.ToString());
|
|
Console.WriteLine(intCount.ToString() + "---" + intAll.ToString());
|
|
|
|
|
|
//释放资源
|
|
bitMap.Dispose();
|
|
int al = intAll - 1000;
|
|
if (intCount > al)
|
|
{
|
|
blnIsTransparent = true;
|
|
}
|
|
return blnIsTransparent;
|
|
}
|
|
|
|
|
|
|
|
public static Bitmap Base64StringToImage(string strbase64)
|
|
{
|
|
try
|
|
{
|
|
byte[] arr = Convert.FromBase64String(strbase64);
|
|
MemoryStream ms = new MemoryStream(arr);
|
|
Bitmap bmp = new Bitmap(ms);
|
|
ms.Close();
|
|
return bmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
public static string ImgToBase64String(Bitmap bmp)
|
|
{
|
|
try
|
|
{
|
|
MemoryStream ms = new MemoryStream();
|
|
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|
byte[] arr = new byte[ms.Length];
|
|
ms.Position = 0;
|
|
ms.Read(arr, 0, (int)ms.Length);
|
|
ms.Dispose();
|
|
ms.Close();
|
|
return Convert.ToBase64String(arr);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
public class MK_Data
|
|
{
|
|
|
|
public static long tenant = 0;
|
|
|
|
|
|
public static void GetTenant(){
|
|
tenant = Globals.Request("tenant") == "" ? 0 : Convert.ToInt64(Globals.Request("tenant"));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取我需要扫描的试卷
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static DataTable GetScanResult()
|
|
{
|
|
GetTenant();
|
|
string sql = "SELECT top 1 * FROM ScanResult WHERE IsMarking=0 order by GroupNo ASC";
|
|
DataTable dt = new MysqlDBHelper(tenant).ExecuteQuery(sql);
|
|
if (dt.Rows.Count > 0)
|
|
{
|
|
return dt;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取我需要扫描的试卷
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static DataTable GetScanResultDetail(int GroupNo)
|
|
{
|
|
GetTenant();
|
|
string sql = "SELECT * FROM ScanResult WHERE GroupNo=" + GroupNo + " AND IsMarking=0 order by pageindex ASC";
|
|
DataTable dt = new MysqlDBHelper(tenant).ExecuteQuery(sql);
|
|
if (dt.Rows.Count > 0)
|
|
{
|
|
return dt;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取主模板数据
|
|
/// </summary>
|
|
/// <param name="temID"></param>
|
|
/// <returns></returns>
|
|
public static DataTable GetMainTempData(long temID)
|
|
{
|
|
|
|
GetTenant();
|
|
string sql = "select detaID_bigint from MK_TempleteDataUser where ID_bigint=" + temID;
|
|
long detaID_bigint = Convert.ToInt64(new MysqlDBHelper(tenant).ExecuteScalar(sql));
|
|
|
|
|
|
sql = "SELECT * FROM MK_TempleteData WHERE ID_bigint = " + detaID_bigint + " ORDER BY PageIndex_int ASC";
|
|
return new MysqlDBHelper(tenant).ExecuteQuery(sql);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取主模板数据
|
|
/// </summary>
|
|
/// <param name="temID"></param>
|
|
/// <returns></returns>
|
|
public static int GetMainTempDataMainBoxType(long temID)
|
|
{
|
|
GetTenant();
|
|
string sql = "SELECT BoxType FROM MK_TempleteMain WHERE ID_bigint=" + temID;
|
|
return Convert.ToInt32(new MysqlDBHelper(tenant).ExecuteScalar(sql));
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取用户模板数据
|
|
/// </summary>
|
|
/// <param name="tempID"></param>
|
|
/// <param name="userID"></param>
|
|
/// <returns></returns>
|
|
public static DataTable GetMinTempDataUser(long tempID, long userID)
|
|
{
|
|
GetTenant();
|
|
string sql = "SELECT * FROM MK_TempleteDataUser WHERE UserID_bigint=" + userID + " AND ID_bigint=" + tempID;
|
|
return new MysqlDBHelper(tenant).ExecuteQuery(sql);
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断是否有重复试卷扫入
|
|
/// </summary>
|
|
/// <param name="ksNum"></param>
|
|
/// <param name="StudentNO"></param>
|
|
/// <returns></returns>
|
|
public static bool CheckRepeatMKFlag(string ksNum, string StudentNO)
|
|
{
|
|
GetTenant();
|
|
string sql = "SELECT COUNT(1) FROM ScanResult WHERE ExamSubjectSchoolId='" + ksNum + "' AND OCRStudentExamNum='" + StudentNO + "' AND ismarking=1";
|
|
int count = Convert.ToInt32(new MysqlDBHelper(tenant).ExecuteScalar(sql));
|
|
if (count > 0)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清理所有该用户数据
|
|
/// </summary>
|
|
public static void DeleteAllMKSTData(string GroupNo, string StudentNO)
|
|
{
|
|
GetTenant();
|
|
string sql = string.Format("DELETE MK_ExamResult WHERE GroupNO_nvarchar = {0} AND StudentNo_nvarchar = '{1}'", GroupNo, StudentNO);
|
|
new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 删除已有考号数据
|
|
/// </summary>
|
|
/// <param name="ksNum"></param>
|
|
/// <param name="StudentNO"></param>
|
|
public static void DeleteStudentExamResultData(string ksNum, string StudentNO)
|
|
{
|
|
GetTenant();
|
|
//删除原始表中的数据
|
|
string sql = string.Format("DELETE MK_ExamResult WHERE ExamID_bigint = {0} AND StudentNo_nvarchar = '{1}'", ksNum, StudentNO);
|
|
new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 新增一条错误数据
|
|
/// </summary>
|
|
/// <param name="et"></param>
|
|
/// <param name="pictureUrl"></param>
|
|
/// <param name="examID"></param>
|
|
/// <param name="studentNO"></param>
|
|
/// <param name="ErroMessage"></param>
|
|
/// <param name="groupID"></param>
|
|
public static void UpdateMkGo(string groupID, string orcStudentNum)
|
|
{
|
|
|
|
GetTenant();
|
|
string sql = string.Format("UPDATE ScanResult SET IsMarking=1,OCRStudentExamNum='" + orcStudentNum + "' WHERE GroupNo=" + groupID);
|
|
new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 新增一条错误数据
|
|
/// </summary>
|
|
/// <param name="et"></param>
|
|
/// <param name="pictureUrl"></param>
|
|
/// <param name="examID"></param>
|
|
/// <param name="studentNO"></param>
|
|
/// <param name="ErroMessage"></param>
|
|
/// <param name="groupID"></param>
|
|
public static void UpdateMkGoNoOrcStudentNum(string groupID)
|
|
{
|
|
|
|
GetTenant();
|
|
string sql = string.Format("UPDATE ScanResult SET IsMarking=1 WHERE GroupNo=" + groupID);
|
|
new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取扫描类型
|
|
/// </summary>
|
|
/// <param name="type"></param>
|
|
/// <returns></returns>
|
|
public static BoxType GetBoxType(int type)
|
|
{
|
|
BoxType b = new BoxType();
|
|
//红框
|
|
if (type == 1)
|
|
{
|
|
b.fillRate = 30;
|
|
b.Threshold = 50;
|
|
}
|
|
if (type == 2)
|
|
{
|
|
b.fillRate = 60;
|
|
b.Threshold = 60;
|
|
}
|
|
if (type == 3)
|
|
{
|
|
b.fillRate = 45;
|
|
b.Threshold = 18;
|
|
}
|
|
return b;
|
|
}
|
|
}
|
|
public class BoxType
|
|
{
|
|
public int fillRate { get; set; }
|
|
public int Threshold { get; set; }
|
|
}
|
|
|
|
|
|
|
|
public class MK_Operater
|
|
{
|
|
// <summary>
|
|
/// 缩放图片
|
|
/// </summary>
|
|
/// <param name="bitmap">原图片</param>
|
|
/// <param name="width">新图片宽度</param>
|
|
/// <param name="height">新图片高度</param>
|
|
/// <returns>新图片</returns>
|
|
public static Bitmap ScaleToSize(Bitmap bitmap, int width, int height)
|
|
{
|
|
try
|
|
{
|
|
|
|
|
|
if (bitmap == null)
|
|
{
|
|
return null;
|
|
}
|
|
if (bitmap.Width == width && bitmap.Height == height)
|
|
{
|
|
return bitmap;
|
|
}
|
|
|
|
var scaledBitmap = new Bitmap(width, height);
|
|
using (var g = Graphics.FromImage(scaledBitmap))
|
|
{
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|
g.DrawImage(bitmap, 0, 0, width, height);
|
|
}
|
|
return scaledBitmap;
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static Image<Bgra, byte> ImageRotates(Bitmap Map, double Dou, bool Bol = true)
|
|
{
|
|
try
|
|
{
|
|
Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
|
|
//Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol);
|
|
// Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol) 等同于
|
|
Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new PointF(Imga1.Width / 2, Imga1.Height / 2), Inter.Cubic, new Bgra(255, 255, 255, 255), Bol);
|
|
return Imga2;
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取偏移量 通过矩形查找
|
|
/// </summary>
|
|
/// <param name="bmp"></param>
|
|
/// <param name="PointPath"></param>
|
|
/// <param name="PostionXY"></param>
|
|
/// <param name="width"></param>
|
|
/// <param name="height"></param>
|
|
/// <returns></returns>
|
|
public static float GetPostionXYByFindRoteBmp(Mat color_mat, VectorOfVectorOfPoint selected_contours, string postionCut)
|
|
{
|
|
|
|
try
|
|
{
|
|
CommonUse commonUse = new CommonUse();
|
|
string[] postionc = postionCut.Split('^');
|
|
Point GrXY;
|
|
int Y2 = 0, Y1 = 0, X2 = 0, X1 = 0;
|
|
for (int i = 0; i < postionc.Length; i++)
|
|
{
|
|
string[] postCutList = postionc[i].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(postCutList[0]));
|
|
int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1]));
|
|
int W = Convert.ToInt32(Convert.ToDouble(postCutList[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(postCutList[3]));
|
|
//commonUse.DrawGridByXY(测试查找坐标.myFrom.PB_guodu, X, W, 1, Y, H, 1);Response.Write(ImgToBase64String(bmp));
|
|
string mx = "";
|
|
try
|
|
{
|
|
mx = commonUse.GetValueAndDrawGrid_Find(color_mat.Bitmap, selected_contours, X, W, 1, Y, H, 1, "", out GrXY);
|
|
}
|
|
catch
|
|
{
|
|
mx = "null";
|
|
GrXY = new Point(0, 0);
|
|
}
|
|
|
|
if (mx.Trim() != "A")
|
|
{
|
|
break;
|
|
}
|
|
Point Mx = GrXY;
|
|
if (i == 0)//左上角
|
|
{
|
|
Y1 = GrXY.Y;
|
|
X1 = GrXY.X;
|
|
|
|
}
|
|
if (i == 2)//左下角
|
|
{
|
|
X2 = GrXY.X;
|
|
Y2 = GrXY.Y;
|
|
}
|
|
}
|
|
return (float)(Math.Atan2((Y2 - Y1), (X2 - X1)) * (180 / Math.PI));
|
|
}
|
|
catch
|
|
{
|
|
return -100;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取偏移量 通过矩形查找
|
|
/// </summary>
|
|
/// <param name="bmp"></param>
|
|
/// <param name="PointPath"></param>
|
|
/// <param name="PostionXY"></param>
|
|
/// <param name="width"></param>
|
|
/// <param name="height"></param>
|
|
/// <returns></returns>
|
|
public static Image<Gray, byte> GetPostionXYByFind(Mat color_mat, VectorOfVectorOfPoint selected_contours, string postionCut)
|
|
{
|
|
|
|
try
|
|
{
|
|
CommonUse commonUse = new CommonUse();
|
|
string[] postionc = postionCut.Split('^');
|
|
string PYPostion = "";
|
|
Point GrXY;
|
|
int PostionWW = 0;
|
|
int PostionHH = 0;
|
|
|
|
|
|
int Y2 = 0, Y1 = 0, X2 = 0, X1 = 0;
|
|
|
|
for (int i = 0; i < postionc.Length; i++)
|
|
{
|
|
string[] postCutList = postionc[i].Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(postCutList[0]));
|
|
int Y = Convert.ToInt32(Convert.ToDouble(postCutList[1]));
|
|
int W = Convert.ToInt32(Convert.ToDouble(postCutList[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(postCutList[3]));
|
|
string mx = "";
|
|
try
|
|
{
|
|
mx = commonUse.GetValueAndDrawGrid_Find(color_mat.Bitmap, selected_contours, X, W, 1, Y, H, 1, "", out GrXY);
|
|
}
|
|
catch
|
|
{
|
|
mx = "null";
|
|
GrXY = new Point(0, 0);
|
|
}
|
|
|
|
if (mx.Trim() != "A")
|
|
{
|
|
break;
|
|
}
|
|
Point Mx = GrXY;
|
|
if (i == 0)//左上角
|
|
{
|
|
PYPostion = GrXY.X + "," + GrXY.Y;
|
|
Y1 = GrXY.Y;
|
|
X1 = GrXY.X;
|
|
|
|
}
|
|
if (i == 1)//右上角
|
|
{
|
|
PostionWW = GrXY.X;
|
|
}
|
|
if (i == 2)//左下角
|
|
{
|
|
PostionHH = GrXY.Y;
|
|
X2 = GrXY.X;
|
|
Y2 = GrXY.Y;
|
|
}
|
|
}
|
|
string[] posList = PYPostion.Split(',');
|
|
int PostionX = Convert.ToInt32(posList[0]);
|
|
int PostionY = Convert.ToInt32(posList[1]);
|
|
int PostionW = PostionWW - PostionX;
|
|
int PostionH = PostionHH - PostionY;
|
|
|
|
//裁剪
|
|
Rectangle rectangle = new Rectangle(PostionX, PostionY, PostionW, PostionH);
|
|
Image<Gray, byte> Sub = new Image<Gray, byte>(color_mat.Bitmap).GetSubRect(rectangle);
|
|
Image<Gray, byte> CropImage = new Image<Gray, byte>(Sub.Size);
|
|
CvInvoke.cvCopy(Sub, CropImage, IntPtr.Zero);
|
|
//获取偏移量
|
|
return CropImage;
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取裁剪 L T W H
|
|
/// </summary>
|
|
/// <param name="PointPath"></param>
|
|
public static Image<Gray, byte> GetMatCutImg(Bitmap bmp, int sX, int sT, int sW, int sH)
|
|
{
|
|
List<Image<Gray, byte>> postionimageCut = new List<Image<Gray, byte>>();
|
|
int L = sX;
|
|
int T = sT;
|
|
int W = sW;
|
|
int H = sH;
|
|
Rectangle rectangle = new Rectangle(L, T, W, H);
|
|
Image<Gray, byte> Sub = new Image<Gray, byte>(bmp).GetSubRect(rectangle);
|
|
Image<Gray, byte> CropImage = new Image<Gray, byte>(Sub.Size);
|
|
CvInvoke.cvCopy(Sub, CropImage, IntPtr.Zero);
|
|
return CropImage;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取主观题
|
|
/// </summary>
|
|
/// <param name="color_mat"></param>
|
|
/// <param name="PYPostion"></param>
|
|
/// <param name="postiontiaomaX"></param>
|
|
/// <returns></returns>
|
|
public static List<ZhuguantiList> GetZhuguantiText(Mat color_mat, string[] PYPostion, string postiontiaomaX, int pageIndex)
|
|
{
|
|
string[] Datalist = postiontiaomaX.Split('^');
|
|
List<ZhuguantiList> lt = new List<ZhuguantiList>();
|
|
CommonUse commonUse = new CommonUse();
|
|
|
|
foreach (string postiontiaoma in Datalist)
|
|
{
|
|
ZhuguantiList zd = new ZhuguantiList();
|
|
string[] tiaomaData = postiontiaoma.Split(',');
|
|
int X = Convert.ToInt32(Convert.ToDouble(tiaomaData[0])) - Convert.ToInt32(PYPostion[0]);
|
|
int Y = Convert.ToInt32(Convert.ToDouble(tiaomaData[1])) - Convert.ToInt32(PYPostion[1]); ;
|
|
int W = Convert.ToInt32(Convert.ToDouble(tiaomaData[2]));
|
|
int H = Convert.ToInt32(Convert.ToDouble(tiaomaData[3]));
|
|
Image<Gray, byte> bytimg = GetMatCutImg(color_mat.Bitmap, X, Y, W, H);
|
|
zd.btm = new Bitmap(bytimg.Bitmap);
|
|
zd.num = tiaomaData[4];
|
|
zd.QuestionSmallNum = Convert.ToInt32(tiaomaData[5]);
|
|
lt.Add(zd);
|
|
bytimg.Bitmap.Dispose();
|
|
}
|
|
return lt;
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Bitmap GetDrawRectangleWhite(Bitmap bit)
|
|
{
|
|
Bitmap bmp = new Bitmap(bit);
|
|
float w = (float)(2);//边框的宽度,可取任意值
|
|
using (Graphics g = Graphics.FromImage(bmp))
|
|
{
|
|
// g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);//抓取背景图
|
|
using (Pen pen = new Pen(Color.White, w))
|
|
{
|
|
|
|
g.DrawRectangle(pen, new Rectangle(0, 0, Math.Abs(bmp.Width), Math.Abs(bmp.Height)));//加边框
|
|
g.Dispose();
|
|
}
|
|
}
|
|
return bmp;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |