using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using Lucee.WebBase.Utils;
using Lucee.WebBase.Data;
using System.Drawing;
using Emgu.CV;
using Emgu.CV.Util;
using Emgu.CV.Structure;
using System.Drawing.Drawing2D;
using System.Net;
using Newtonsoft;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System.Web.Script.Serialization;
using MySql.Data.MySqlClient;
using Emgu.CV.Flann;
using System.Data.SqlTypes;
using System.Security.AccessControl;
using System.IO;

public partial class 外部答题卡_Default : System.Web.UI.Page
{
    public long TempID = 0;
    public long AnotherTempID = 0;
    public string PageIndex = "0";
    public string Bindlist = "";
    public string imgage = "";
    public string ExamNO = "";
    public string isLocked = "";
    public string HideAreaText = "";
    public string IsPostionValue = "";
    public long tenant = 0;
    public string pager = "";
    public int isHand = 0;
    public string MainTempId = "0";
    public int PageCount = 0;
    protected void Page_Load(object sender, EventArgs e)
    {

        int action = Globals.Request("action") == "" ? 0 : Convert.ToInt32(Globals.Request("action"));
        tenant = Globals.Request("tenant") == "" ? 0 : Convert.ToInt64(Globals.Request("tenant"));
        isHand = Globals.Request("isHand") == "" ? 0 : Convert.ToInt32(Globals.Request("isHand"));
        pager = Globals.Request("pager").ToLower();

        if (action != 0)
        {
            Response.Clear();
            switch (action)
            {
                case 1:
                    UpdateTempData();
                    break;
                case 2:
                    LockTemp();
                    break;
            }
            Response.End();
        }
        else
        {
            TempID = Globals.Request("TempID") == "" ? 0 : Convert.ToInt32(Globals.Request("TempID"));//获取小模板ID
            if (TempID == 0)
            {
                Response.Write("<script>alert('无模板数据');window.close();</script>");
                return;
            }
            string sql = "select * from MK_TempleteData where ID_bigint=" + TempID;
            DataTable dtx = new MysqlDBHelper(tenant).ExecuteQuery(sql);
            if (dtx.Rows.Count > 0)
            {
                Bindlist = dtx.Rows[0]["TempValue_nvarchar"].ToString();
                imgage = dtx.Rows[0]["TempPicture64_nvarchar"].ToString();
                isLocked = dtx.Rows[0]["islock_bit"] == null ? "" : dtx.Rows[0]["islock_bit"].ToString();
                HideAreaText = dtx.Rows[0]["HideAreaPostionList_nvarchar"] == null ? "" : dtx.Rows[0]["HideAreaPostionList_nvarchar"].ToString();
                IsPostionValue = dtx.Rows[0]["HideAreaPostionList_nvarchar"] == null ? "" : dtx.Rows[0]["HideAreaPostionList_nvarchar"].ToString();
                PageIndex = dtx.Rows[0]["PageIndex_int"] == null ? "" : dtx.Rows[0]["PageIndex_int"].ToString();
                MainTempId = dtx.Rows[0]["MainID_bigint"].ToString();

                sql = "select MainPage_int,HasPosition from MK_TempleteMain where ID_bigint=" + MainTempId;
                var maindt = new MysqlDBHelper(tenant).ExecuteQuery(sql);
                if (maindt == null || maindt.Rows.Count <= 0)
                {
                    Response.Write("<script>alert('主模板数据有问题');</script>");
                    return;
                }
                PageCount = Convert.ToInt32(maindt.Rows[0]["MainPage_int"]);
                IsPostionValue = maindt.Rows[0]["HasPosition"].ToString();

                if (PageCount > 1)
                {
                    sql = "select ID_bigint from MK_TempleteData where MainID_bigint=" + MainTempId + " and ID_bigint!=" + TempID;
                    AnotherTempID = Convert.ToInt32(new MysqlDBHelper(tenant).ExecuteScalar(sql));
                }
            }
        }

    }

    private void UpdateTempData()
    {
        TempID = Globals.Request("TempID") == "" ? 0 : Convert.ToInt32(Globals.Request("TempID"));//获取小模板ID
        string totalHtml = Server.UrlDecode(Globals.Request("totalHtml"));
        string HideAreaPostionList = Server.UrlDecode(Globals.Request("HideAreaPostionList"));

        if (AnsyTemp(HideAreaPostionList, totalHtml))
        {
            string sql = "Update MK_TempleteData SET TempValue_nvarchar=@TempValue_nvarchar,HideAreaPostionList_nvarchar=@HideAreaPostionList_nvarchar where ID_bigint=" + TempID;
            MySqlParameter[] sp = new MySqlParameter[] {
                new MySqlParameter("@TempValue_nvarchar",totalHtml),
                new MySqlParameter("@HideAreaPostionList_nvarchar",HideAreaPostionList)
            };
            string[] totalHtmlList = totalHtml.Split('$');
            new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp);
        }




        //if (new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp) == 1)
        //{
        //    if (totalHtmlList[0] == "")
        //    {
        //        Response.Write("ok");
        //    }
        //    else
        //    {
        //        AnsyTemp(HideAreaPostionList);
        //    }
        //}
        //else {
        //    Response.Write("0");
        //}

    }

    private void LockTemp()
    {
        TempID = Globals.Request("TempID") == "" ? 0 : Convert.ToInt32(Globals.Request("TempID"));//获取小模板ID
        string totalHtml = Server.UrlDecode(Globals.Request("totalHtml"));
        string HideAreaPostionList = Server.UrlDecode(Globals.Request("HideAreaPostionList"));
        string[] totalHtmlList = totalHtml.Split('$');

        if (AnsyTemp(HideAreaPostionList, totalHtml))
        {
            string sql = "Update MK_TempleteData SET TempValue_nvarchar=@TempValue_nvarchar,HideAreaPostionList_nvarchar=@HideAreaPostionList_nvarchar,islock_bit=1 where ID_bigint=" + TempID;
            MySqlParameter[] sp = new MySqlParameter[] {
                new MySqlParameter("@TempValue_nvarchar",totalHtml),
                new MySqlParameter("@HideAreaPostionList_nvarchar",HideAreaPostionList)
            };
            AddQuestionData(totalHtml);
            new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp);
        }
        //if (new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp) == 1)
        //{
        //    if (totalHtmlList[0] == "")
        //    {
        //        Response.Write("ok");
        //    }
        //    else {
        //        AnsyTemp(HideAreaPostionList);
        //    }
        //}
        //else
        //{
        //    Response.Write("0");
        //}
    }

    private void AddQuestionData(string totalHtml)
    {
        TempID = Convert.ToInt64(Globals.Request("TempID"));
        string[] totalHtmlList = totalHtml.Split('$');
        string kg = totalHtmlList[2];
        string zg = totalHtmlList[3];

        string[] questionlist = kg.Trim('^').Split('^');
        string[] zglist = zg.Trim('^').Split('^');
        string sql = "";
        if (kg != "")
        {
            for (int i = 0; i < questionlist.Length; i++)
            {
                string[] detailtList = questionlist[i].Split(',');
                string starNum = detailtList[4].ToUpper();
                string endNum = detailtList[5].ToUpper();

                string score = detailtList[9];
                if (score == "")
                {
                    score = "0";
                }
                string selectNum = detailtList[6];
                string isselectmore = detailtList[8];



                string bigNum = "";
                if (starNum.Contains("M"))
                {
                    bigNum = starNum.Split('M')[0];
                    int startSmallNum = Convert.ToInt32(starNum.Split('M')[1]);
                    int endSmallNum = Convert.ToInt32(endNum.Split('M')[1]);
                    for (int j = Convert.ToInt32(startSmallNum); j <= Convert.ToInt32(endSmallNum); j++)
                    {
                        sql = "SELECT COUNT(1) FROM MK_TempQuestionData WHERE TempID_bigint=" + TempID + " AND QuestionIndex_int='" + (bigNum + "." + j) + "'";
                        if (new MysqlDBHelper(tenant).ExecuteScalar(sql).ToString() == "0")
                        {
                            sql = "INSERT INTO MK_TempQuestionData(TempID_bigint,QuestionIndex_int,SmallQuestionDetail_nvarchar,Score_float,createdtime_datetime,smallQuestionNum_int,questiontype_int,selectNum_int,selecttype_int) VALUES(@TempID_bigint,@QuestionIndex_int,@SmallQuestionDetail_nvarchar,@Score_float,'" + DateTime.Now + "',@smallQuestionNum_int,0,@selectNum_int,@selecttype_int)";
                            MySqlParameter[] sp = new MySqlParameter[] {
                        new MySqlParameter("@TempID_bigint",TempID),
                        new MySqlParameter("@QuestionIndex_int",bigNum+"."+j),
                        new MySqlParameter("@SmallQuestionDetail_nvarchar",""),
                        new MySqlParameter("@smallQuestionNum_int","1"),
                        new MySqlParameter("@Score_float",score),
                        new MySqlParameter("@selectNum_int",selectNum),
                        new MySqlParameter("@selecttype_int",isselectmore),

                    };
                            new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp);
                        }
                    }

                }
                else
                {
                    for (int j = Convert.ToInt32(starNum); j <= Convert.ToInt32(endNum); j++)
                    {
                        sql = "SELECT COUNT(1) FROM MK_TempQuestionData WHERE TempID_bigint=" + TempID + " AND QuestionIndex_int='" + j + "'";
                        if (new MysqlDBHelper(tenant).ExecuteScalar(sql).ToString() == "0")
                        {
                            sql = "INSERT INTO MK_TempQuestionData(TempID_bigint,QuestionIndex_int,SmallQuestionDetail_nvarchar,Score_float,createdtime_datetime,smallQuestionNum_int,questiontype_int,selectNum_int,selecttype_int) VALUES(@TempID_bigint,@QuestionIndex_int,@SmallQuestionDetail_nvarchar,@Score_float,'" + DateTime.Now + "',@smallQuestionNum_int,0,@selectNum_int,@selecttype_int)";
                            MySqlParameter[] sp = new MySqlParameter[] {
                        new MySqlParameter("@TempID_bigint",TempID),
                        new MySqlParameter("@QuestionIndex_int",j),
                        new MySqlParameter("@SmallQuestionDetail_nvarchar",""),
                        new MySqlParameter("@smallQuestionNum_int","1"),
                        new MySqlParameter("@Score_float",score),
                        new MySqlParameter("@isSelectMore_bit",isselectmore),
                        new MySqlParameter("@selectNum_int",selectNum),
                        new MySqlParameter("@selecttype_int",isselectmore),

                    };
                            new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp);
                        }
                    }
                }
            }
        }
        if (zg != "")
        {
            for (int i = 0; i < zglist.Length; i++)
            {
                string[] detailtList = zglist[i].Split(',');
                bool issplit = false;
                if (detailtList[4].Contains("X"))
                {
                    issplit = true;
                    detailtList[4] = detailtList[4].Split('X')[0];
                }

                //sql = "SELECT COUNT(1) FROM MK_TempQuestionData WHERE TempID_bigint=" + TempID + " AND QuestionIndex_int='" + detailtList[4] + "'";
                sql = String.Format("SELECT COUNT(1) FROM MK_TempQuestionData where TempID_bigint in(select ID_bigint from MK_TempleteData where MainID_bigint =(SELECT MainID_bigint FROM " +
                    "`MK_TempleteData` where ID_bigint={0})) AND QuestionIndex_int='{1}';", TempID, detailtList[4]);


                string mkscoretype = "";
                if (string.IsNullOrEmpty(detailtList[7]))
                {
                    mkscoretype = "1";
                }
                else
                {
                    mkscoretype = detailtList[7];
                }


                if (new MysqlDBHelper(tenant).ExecuteScalar(sql).ToString() == "0")
                {
                    sql = "INSERT INTO MK_TempQuestionData(TempID_bigint,QuestionIndex_int,SmallQuestionDetail_nvarchar,Score_float,createdtime_datetime,smallQuestionNum_int,questiontype_int,mkscoretype_float,is_split) VALUES(@TempID_bigint,@QuestionIndex_int,@SmallQuestionDetail_nvarchar,@Score_float,'" + DateTime.Now + "',@smallQuestionNum_int,1,@mkscoretype_float,@is_split)";
                    MySqlParameter[] sp = new MySqlParameter[] {
                        new MySqlParameter("@TempID_bigint",TempID),
                        new MySqlParameter("@QuestionIndex_int",detailtList[4]),
                        new MySqlParameter("@SmallQuestionDetail_nvarchar",""),
                        new MySqlParameter("@Score_float",detailtList[6]==""? "0" : detailtList[6]),
                        new MySqlParameter("@smallQuestionNum_int",detailtList[5]),
                        new MySqlParameter("@mkscoretype_float",mkscoretype),
                        new MySqlParameter("@is_split",issplit)
                    };
                    new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp);
                }
            }
        }
    }

    /// <summary>
    /// 锁定模板数据
    /// </summary>
    public bool AnsyTemp(string HideAreaPostionList, string totalHtml)
    {
        try
        {
            CommonUse commonUse = new CommonUse();
            long TempID = Convert.ToInt64(Globals.Request("TempID"));
            string sql = "SELECT * FROM MK_TempleteData WHERE ID_bigint=" + TempID;
            DataTable dt = new MysqlDBHelper(tenant).ExecuteQuery(sql);
            if (dt.Rows.Count <= 0)
            {
                Response.Write("NO DATA");
                return false;
            }
            Bitmap PictureBoxBitMap = UrlToImage(dt.Rows[0]["TempPicture64_nvarchar"].ToString());

            if (PictureBoxBitMap == null)
            {
                Response.Write("NO PICTURE");
            }
            string[] GetData = totalHtml.Split('$');
            string PYPostionList = "";



            if (GetData[0] != "")//如果有定位点
            {
                //计算模板图片参数
                double xielv = 0;
                int width = Convert.ToInt32(GetData[6].Split(',')[0]);
                int height = Convert.ToInt32(GetData[6].Split(',')[1]);
                PictureBoxBitMap = ScaleToSize(PictureBoxBitMap, width, height);
                Image<Gray, byte> currentFramext = new Image<Gray, byte>(PictureBoxBitMap);

                Image<Gray, byte> myImage = new Image<Gray, byte>(commonUse.FilterRed(PictureBoxBitMap));
                  
                // 进行中值滤波
                CvInvoke.MedianBlur(myImage, myImage, 5);
                // 进行高斯滤波
                CvInvoke.GaussianBlur(myImage, myImage, new Size(5, 5), 0);

                // 去除定位点周围噪点
                //Image<Bgr, byte> blur = myImage.AddWeighted(myImage, 1.9, -0.5, 0);

                Bitmap bm_dest = myImage.Bitmap;
                Image<Gray, byte> EmguImagex1 = new Image<Gray, byte>(bm_dest);
                Mat mat_threshold1 = new Mat();
                CvInvoke.Threshold(EmguImagex1, mat_threshold1, 210, 255, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
                Mat mat_dilate = commonUse.MyDilate(mat_threshold1);
                VectorOfVectorOfPoint selected_contours1 = commonUse.GetUsefulContoursDingWei(mat_dilate, 1);

                //var color_mat1 = commonUse.DrawContours(mat_dilate, selected_contours1);
                //commonUse.ShowMatWaitKey("44444", color_mat1, 0.8);

                ////Response.Write(ImgToBase64String(color_mat1.Bitmap));
                //return false;



                //Image<Gray, byte> imagex = new Image<Gray, byte>(PictureBoxBitMap);
                //Mat mat_threshold1 = new Mat();
                //CvInvoke.Threshold(imagex, mat_threshold1, 160, 255, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
                //Mat mat_dilate1 = commonUse.MyDilate(mat_threshold1);
                //VectorOfVectorOfPoint selected_contours1;
                //selected_contours1 = commonUse.GetUsefulContoursDingWei(mat_dilate1, 1);
                string message = string.Empty;
                Mat color_mxxx = commonUse.GetPostionXYByFindPostionAndXieLv(currentFramext.Mat, selected_contours1, GetData[0], out PYPostionList, currentFramext, out xielv,out message);
                if (xielv == -100)
                {
                    Response.Write(message);
                    return false;
                }
                int oldWidth = color_mxxx.Bitmap.Width;
                int oldHeight = color_mxxx.Bitmap.Height;
                string tempEx = TempV(GetData, PYPostionList, oldWidth, oldHeight, HideAreaPostionList);
                if (tempEx != "ok")
                {
                    Response.Write(tempEx);
                    return false;
                }



                int PageIndex = Convert.ToInt32(Globals.Request("PageIndex"));
                if (PageIndex == 1)
                {
                    //计算标准点
                    int mx = GetOtherBitmaplist(currentFramext.Mat, 160, PYPostionList.Split(','), GetData[9]);
                    if (mx == 0)
                    {
                        Response.Write("标准点数据错误，请重新框选");
                        return false;
                    }
                    else
                    {
                        long MainTempId = Convert.ToInt64(Globals.Request("MainTempId"));
                        sql = "UPDATE MK_TempleteMain SET option_pixel_options=" + mx + " WHERE ID_bigint=" + MainTempId;
                        new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
                    }

                    // 存在锚定点数据则判断锚定点内容
                    //if (!string.IsNullOrWhiteSpace(GetData[10]) && GetData[10].Split(',').Length == 6)
                    //{
                    //    //计算锚定点 
                    //    var ocrResultText = string.Empty;
                    //    if (!GetMaoDingDian(PictureBoxBitMap, GetData[10], out ocrResultText))
                    //    {
                    //        Response.Write("未找到匹配的文字,识别结果【" + ocrResultText+"】");
                    //        return false;
                    //    }
                    //}
                }


                sql = "UPDATE MK_TempleteData SET XieLv_float =@XieLv_float,CutWidth_int=@CutWidth_int,CutHeight_int=@CutHeight_int,PyPPostion_nvarchar=@PyPPostion_nvarchar WHERE ID_bigint=" + TempID;
                MySqlParameter[] sp = new MySqlParameter[] {
                new MySqlParameter("@XieLv_float",xielv),
                new MySqlParameter("@CutWidth_int",oldWidth),
                new MySqlParameter("@CutHeight_int",oldHeight),
                new MySqlParameter("@PyPPostion_nvarchar",PYPostionList)
                };

                if (new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp) > 0)
                {

                }
                currentFramext.Dispose();
                color_mxxx.Dispose();
                PictureBoxBitMap.Dispose();
                Response.Write("ok");
                return true;
            }
            else
            {
                int width = Convert.ToInt32(GetData[6].Split(',')[0]);
                int height = Convert.ToInt32(GetData[6].Split(',')[1]);
                PictureBoxBitMap = ScaleToSize(PictureBoxBitMap, width, height);
                Image<Gray, byte> imagex = new Image<Gray, byte>(PictureBoxBitMap);
                Mat mat_threshold1 = new Mat();
                CvInvoke.Threshold(imagex, mat_threshold1, 160, 255, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
                Mat mat_dilate1 = commonUse.MyDilate(mat_threshold1);
                VectorOfVectorOfPoint selected_contours1;
                selected_contours1 = commonUse.GetUsefulContoursDingWei(mat_dilate1, 1);
                Image<Gray, byte> currentFramext = new Image<Gray, byte>(PictureBoxBitMap);

                int PageIndex = Convert.ToInt32(Globals.Request("PageIndex"));
                if (PageIndex == 1)
                {
                    int mx = GetOtherBitmaplist(currentFramext.Mat, 160, PYPostionList.Split(','), GetData[9]);
                    long MainTempId = Convert.ToInt64(Globals.Request("MainTempId"));
                    if (mx == 0)
                    {
                        Response.Write("标准点数据错误，请重新框选");
                        return false;
                    }
                    else
                    {
                        sql = "UPDATE MK_TempleteMain SET option_pixel_options=" + mx + " WHERE ID_bigint=" + MainTempId;
                        new MysqlDBHelper(tenant).ExecuteNoQuery(sql);
                    }
                }
                //计算模板图片参数
                double xielv = 0;
                width = Convert.ToInt32(GetData[6].Split(',')[0]);
                height = Convert.ToInt32(GetData[6].Split(',')[1]);
                sql = "UPDATE MK_TempleteData SET XieLv_float =@XieLv_float,CutWidth_int=@CutWidth_int,CutHeight_int=@CutHeight_int,PyPPostion_nvarchar=@PyPPostion_nvarchar WHERE ID_bigint=" + TempID;
                MySqlParameter[] sp = new MySqlParameter[] {
                        new MySqlParameter("@XieLv_float",xielv),
                        new MySqlParameter("@CutWidth_int",width),
                        new MySqlParameter("@CutHeight_int",height),
                        new MySqlParameter("@PyPPostion_nvarchar",PYPostionList)
                };
                if (new MysqlDBHelper(tenant).ExecuteNoQuery(sql, sp) > 0)
                {

                }
                PictureBoxBitMap.Dispose();
                Response.Write("ok");
                return true;
            }
        }
        catch (Exception ex)
        {
            return false;
            Response.Write("TEMPERRO");
        }
    }

    /// <summary>
    /// 获取其他截图
    /// </summary>
    /// <param name="color_mat"></param>
    /// <param name="PYPostion"></param>
    /// <param name="postiontiaomaX"></param>
    /// <param name="selected_contours"></param>
    /// <param name="pageIndex"></param>
    /// <returns></returns>
    public static int GetOtherBitmaplist(Mat color_mat, int Threshold, string[] PYPostion, string postiontiaomaX)
    {
        CommonUse commonUse = new CommonUse();
        string[] quekao = postiontiaomaX.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 X = Convert.ToInt32(Convert.ToDouble(quekao[0]));
        int Y = Convert.ToInt32(Convert.ToDouble(quekao[1]));
        int W = Convert.ToInt32(Convert.ToDouble(quekao[2]));
        int H = Convert.ToInt32(Convert.ToDouble(quekao[3]));
        int xuanXiang = 1;//选项数量
        int tiliang = 1;//题量
        //string mx = "";
        int wL = Convert.ToInt32(W / xuanXiang);
        int hL = Convert.ToInt32(H / tiliang);

        Image<Gray, byte> bytimg = GetMatCutImg(color_mat.Bitmap, X, Y, W, H);

        X = 0; Y = 0;
        Mat src = bytimg.Mat;
        Mat mat_threshold = new Mat();
        CvInvoke.Threshold(src, mat_threshold, Threshold, 254, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
        Mat mat_dilate = commonUse.MyDilate(mat_threshold);
        VectorOfVectorOfPoint selected_contours;
        int option_pixel_options = 0;
        selected_contours = GetUsefulContoursSelectoOptionQK(mat_dilate, 1, out option_pixel_options);

        //mx = GetValueAndDrawGrid_Other(src.Bitmap, selected_contours, X, wL, xuanXiang, Y, hL, tiliang, "");
        bytimg.Dispose();
        src.Dispose();
        return option_pixel_options;
    }

    /// <summary>
    /// 获取其他截图
    /// </summary>
    /// <param name="color_mat"></param>
    /// <param name="PYPostion"></param>
    /// <param name="postiontiaomaX"></param>
    /// <param name="selected_contours"></param>
    /// <param name="pageIndex"></param>
    /// <returns></returns>
    public static bool GetMaoDingDian(Bitmap srcBimap, string positionStr, out string ocrResultText)
    {
        ocrResultText = string.Empty;
        CommonUse commonUse = new CommonUse();
        string[] ocrText = positionStr.Split(',');

        int X = Convert.ToInt32(Convert.ToDouble(ocrText[0]));
        int Y = Convert.ToInt32(Convert.ToDouble(ocrText[1]));
        int W = Convert.ToInt32(Convert.ToDouble(ocrText[2]));
        int H = Convert.ToInt32(Convert.ToDouble(ocrText[3]));

        Image<Gray, byte> bytimg = GetMatCutImg(srcBimap, X, Y, W, H);



        //commonUse.ShowMatWaitKey("maodingdian", bytimg.Mat, 2);

        ////var ocrResult = OcrHelper.GetOcrResult(bytimg.Bitmap);
        ////if (ocrResult == null || string.IsNullOrWhiteSpace(ocrResult.Text))
        ////{
        ////    // 未找到任何文字
        ////    return false;
        ////}

        //ocrResultText = ocrResult.Text;

        //if (bytimg != null)
        //{
        //    bytimg.Dispose();
        //}

        //var ocrResultArr = ocrResult.Text.ToCharArray();
        //var ocrTestArr = ocrText[5].ToCharArray();
        //var interList = ocrTestArr.Intersect(ocrResultArr);
        //if (interList.Count() == ocrTestArr.Length)
        //{
        //    // 找到输入文字
        //    return true;
        //}
        //ocrResultText = ocrResult.Text;
        // 未找到输入文字
        return false;
    }


    /// <summary>
    /// 筛选图中符合给定条件的轮廓
    /// </summary>
    /// <param name="mat_threshold">要提取轮廓的图片</param>
    /// <param name="width1">轮廓外接矩形大于该宽度值</param>
    /// <param name="width2">轮廓外接矩形小于该宽度值</param>
    /// <param name="height1">轮廓外接矩形大于该高度值</param>
    /// <param name="height2">轮廓外接矩形小于该高度值</param>
    public static VectorOfVectorOfPoint GetUsefulContoursSelectoOptionQK(Mat mat, double ratio, out int option_pixel_options)
    {
        option_pixel_options = 0;
        VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();//所有的轮廓
        VectorOfVectorOfPoint selected_contours = new VectorOfVectorOfPoint();//用于存储筛选过后的轮廓
        CvInvoke.FindContours(mat, contours, null, Emgu.CV.CvEnum.RetrType.External,
            Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);//提取所有轮廓，操作过程中会对输入图像进行修改

        //筛选轮廓。筛选条件：长宽比大于给定值
        for (int i = 0; i < contours.Size; i++)
        {
            Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);//外接矩形
            Mat temp = new Mat(mat, rect);//提取ROI矩形区域
            int pxNums = CvInvoke.CountNonZero(temp);//计算图像内非零像素个数

            double area = CvInvoke.ContourArea(contours[i]);//计算连通轮廓的面积
            double length = CvInvoke.ArcLength(contours[i], false); //计算连通轮廓的周长

            VectorOfPoint approx_curve = new VectorOfPoint();//用于存放逼近的结果
            CvInvoke.ApproxPolyDP(contours[i], approx_curve, length * 0.02, true);
            //bool bo = (area > 500 && area < 12000);//&& rect.Height<100
            //bool bo = ((area > 20 && area < 150000) && rect.Height > 8 );
            bool bo = ((area > 10 && area < 150000) && rect.Height > 5);
            if (bo)
            {
                if (pxNums > (area * 0.7))
                {
                    option_pixel_options = pxNums;
                    selected_contours.Push(contours[i]);
                }
            }
        }
        return selected_contours;
    }


    public static VectorOfVectorOfPoint GetUsefulContoursForMaoDingDian(Mat mat)
    {
        VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();//所有的轮廓
        VectorOfVectorOfPoint selected_contours = new VectorOfVectorOfPoint();//用于存储筛选过后的轮廓
        CvInvoke.FindContours(mat, contours, null, Emgu.CV.CvEnum.RetrType.List,
            Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);//提取所有轮廓，操作过程中会对输入图像进行修改

        //筛选轮廓。筛选条件：长宽比大于给定值
        for (int i = 0; i < contours.Size; i++)
        {
            Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);//外接矩形
            Mat temp = new Mat(mat, rect);//提取ROI矩形区域
            int pxNums = CvInvoke.CountNonZero(temp);//计算图像内非零像素个数

            double area = CvInvoke.ContourArea(contours[i]);//计算连通轮廓的面积
            double length = CvInvoke.ArcLength(contours[i], false); //计算连通轮廓的周长

            VectorOfPoint approx_curve = new VectorOfPoint();//用于存放逼近的结果
            CvInvoke.ApproxPolyDP(contours[i], approx_curve, length * 0.02, true);

            bool bo = ((area > 10 && area < 150000) && rect.Height > 5 && rect.Width > 5);
            if (bo)
            {
                selected_contours.Push(contours[i]);
            }
        }
        return selected_contours;
    }

    /// <summary>
    /// 画出网格并返回填图结果
    /// </summary>
    /// <param name="img"></param>
    /// <param name="contours"></param>
    /// <param name="x_begin">左边距</param>
    /// <param name="x_interval">方块长度</param>
    /// <param name="x_num">方块数量</param>
    /// <param name="y_begin">上边距</param>
    /// <param name="y_interval">方块高度</param>
    /// <param name="y_num">方块竖数量</param>
    /// <param name="strText">输出文字</param>
    /// <returns></returns>
    public static string GetValueAndDrawGrid_Other(Bitmap img, VectorOfVectorOfPoint contours,
        int x_begin, int x_interval, int x_num, int y_begin, int y_interval, int y_num, string strText)
    {
        //画网格
        //Mat mat_grid = DrawGridByXY(img, x_begin, x_interval, x_num, y_begin, y_interval, y_num);


        int[] intArray = GetTargetValues_L_Other(contours, x_begin, x_interval, x_num, y_begin, y_interval, y_num, img, strText);
        int maxValue = GetMaxValueOfArray(intArray);//数组最大值

        string str = "";
        //str += Environment.NewLine;//回车
        str += strText;
        if (maxValue >= 4 && maxValue < 10)
        {
            str += GetStringOfIntArray(intArray, "ABCDEFGH");
        }
        else
        {
            if (maxValue >= 10)
            {
                str += GetStringOfIntArray(intArray, "ABCDEFGH");
            }
            else
            {
                str += GetStringOfIntArray(intArray, "ABCDEFGH");
            }

        }

        return str;
    }

    /// <summary>
    /// 拼接给定int数组内容，并返回拼接后字符串
    /// </summary>
    /// <param name="arr"></param>
    /// <returns></returns>
    public static string GetStringOfIntArray(int[] arr, string ss = "ABCD")
    {
        string str = "";
        //char[] ch = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
        char[] ch = ss.ToCharArray();
        foreach (int a in arr)
        {
            ///
            if (a >= 10)
            {
                string x = a.ToString();
                char[] cc = x.ToArray();

                int[] result = new int[cc.Length];

                for (int i = 0; i < cc.Length; i++)
                {
                    result[i] = Convert.ToInt32(x.Substring(i, 1));
                }
                Array.Sort(result);

                int[] finalResult = result;
                for (int j = 0; j < finalResult.Length; j++)
                {
                    if (finalResult[j] == -1)
                    {
                        str += "null";
                    }
                    else
                    {
                        str += ch[finalResult[j]];
                    }
                }
                str += " ";
            }
            else
            {
                if (a == -1)
                {
                    str += "null ";//未识别时，标示为空
                }
                else
                {
                    str += ch[a] + " ";
                }

            }
        }
        return str;
    }


    /// <summary>
    /// 获取一维int数组中最大值
    /// </summary>
    /// <param name="arr"></param>
    /// <returns></returns>
    public static int GetMaxValueOfArray(int[] arr)
    {
        int[] dst = new int[arr.Length];
        Array.Copy(arr, dst, arr.Length);//深度复制数组，防止排序对原数组产生影响
        Array.Sort(dst);//数组排序
        int maxValue = dst[arr.Length - 1];//数组最大值
        return maxValue;
    }

    // <summary>
    /// 根据给定的轮廓及范围信息计算涂卡的结果，返回int数组
    /// </summary>
    /// <param name="contours"></param>
    /// <param name="x"></param>
    /// <param name="x_interval"></param>
    /// <param name="x_num"></param>
    /// <param name="y"></param>
    /// <param name="y_interval"></param>
    /// <param name="y_num"></param>
    /// <returns></returns>
    public static int[] GetTargetValues_L_Other(VectorOfVectorOfPoint contours, int x_begin, int x_interval, int x_num,
        int y_begin, int y_interval, int y_num, Bitmap img, string strText)
    {
        int[] result = new int[y_num];//结果数组
                                      //数组初值默认为-1
        for (int i = 0; i < y_num; i++)
        {
            result[i] = -1;
        }
        int x_max = x_begin + x_interval * x_num;
        int y_max = y_begin + y_interval * y_num;


        VectorOfVectorOfPoint targetContours = new VectorOfVectorOfPoint();
        Point[] gravity = GetGravityOfContours(contours);//轮廓中心点坐标
        for (int i = 0; i < contours.Size; i++)
        {
            VectorOfPoint contour = contours[i];

            if (gravity[i].X < x_begin || gravity[i].X > x_max || gravity[i].Y < y_begin || gravity[i].Y > y_max)
            {
                continue;//判断中心点是否超出范围
            }

            int x_id = (int)Math.Floor((double)(gravity[i].Y - y_begin) / y_interval);//向右取整数
            int value = (int)Math.Floor((double)(gravity[i].X - x_begin) / x_interval);

            if (result[x_id] != -1)
            {


            }
            else
            {

                result[x_id] = value;
            }
        }

        return result;
    }

    /// <summary>
    /// 计算轮廓中心点坐标
    /// </summary>
    /// <param name="selected_contours">要计算中心点的轮廓</param>
    /// <returns></returns>
    public static Point[] GetGravityOfContours(VectorOfVectorOfPoint selected_contours)
    {
        int ksize = selected_contours.Size;

        double[] m00 = new double[ksize];
        double[] m01 = new double[ksize];
        double[] m10 = new double[ksize];
        Point[] gravity = new Point[ksize];//用于存储轮廓中心点坐标
        MCvMoments[] moments = new MCvMoments[ksize];

        for (int i = 0; i < ksize; i++)
        {
            VectorOfPoint contour = selected_contours[i];
            //计算当前轮廓的矩
            moments[i] = CvInvoke.Moments(contour, false);


            m00[i] = moments[i].M00;
            m01[i] = moments[i].M01;
            m10[i] = moments[i].M10;
            int x = Convert.ToInt32(m10[i] / m00[i]);//计算当前轮廓中心点坐标
            int y = Convert.ToInt32(m01[i] / m00[i]);
            gravity[i] = new Point(x, y);
        }
        return gravity;
    }




    /// <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="getdata"></param>
    private string TempV(string[] GetData, string PYPostionList, int oldWidth, int oldHeight, string HideAreaPostionList)
    {
        double pyLeft = Convert.ToInt32(PYPostionList.Split(',')[0]);
        double pyTop = Convert.ToInt32(PYPostionList.Split(',')[1]);
        double Xtop = 0;
        double Xleft = 0;
        double Xwidth = 0;
        double Xheight = 0;
        if (GetData[1] != "")
        {
            string[] list = GetData[1].Split(',');
            Xleft = Convert.ToDouble(list[0]);
            Xtop = Convert.ToDouble(list[1]);
            Xwidth = Convert.ToDouble(list[2]);
            Xheight = Convert.ToDouble(list[3]);
            if (Xleft < pyLeft)
            {
                return "学号编辑框左边超过定位点边界!";

            }
            if (Xleft + Xwidth - pyLeft > oldWidth)
            {
                return "学号编辑框右边超过定位点边界!";
            }
            if (Xtop < pyTop)
            {
                return "学号编辑框上边超过定位点边界!";
            }

            if (Xtop + Xheight - pyTop > oldHeight)
            {
                return "学号编辑框下边超过定位点边界!";
            }
        }

        if (GetData[2] != "")//客观题
        {
            string[] keguantiList = GetData[2].Split('^');
            foreach (string slist in keguantiList)
            {
                string[] list = slist.Split(',');
                Xleft = Convert.ToDouble(list[0]);
                Xtop = Convert.ToDouble(list[1]);
                Xwidth = Convert.ToDouble(list[2]);
                Xheight = Convert.ToDouble(list[3]);
                string tihao = list[4] + "-" + list[5];
                if (Xleft < pyLeft)
                {
                    return "客观题：[" + tihao + "] 编辑框左边超过定位点边界!";
                }
                if (Xleft + Xwidth - pyLeft > oldWidth)
                {
                    return "客观题：[" + tihao + "]编辑框右边超过定位点边界!";
                }
                if (Xtop < pyTop)
                {
                    return "客观题：[" + tihao + "] 编辑框上边超过定位点边界!";
                }

                if (Xtop + Xheight - pyTop > oldHeight)
                {
                    return "客观题：[" + tihao + "] 编辑框下边超过定位点边界!";
                }
            }
        }
        if (GetData[3] != "")//主观题
        {
            string[] keguantiList = GetData[3].Split('^');
            foreach (string slist in keguantiList)
            {
                string[] list = slist.Split(',');
                Xleft = Convert.ToDouble(list[0]);
                Xtop = Convert.ToDouble(list[1]);
                Xwidth = Convert.ToDouble(list[2]);
                Xheight = Convert.ToDouble(list[3]);
                string tihao = list[4];
                if (Xleft < pyLeft)
                {
                    return "主观题：[" + tihao + "] 编辑框左边超过定位点边界!";
                }
                if (Xleft + Xwidth - pyLeft > oldWidth)
                {
                    return "主观题：[" + tihao + "] 编辑框右边超过定位点边界!";
                }
                if (Xtop < pyTop)
                {
                    return "主观题：[" + tihao + "] 编辑框上边超过定位点边界!";
                }

                if (Xtop + Xheight - pyTop > oldHeight)
                {
                    return "主观题：[" + tihao + "] 编辑框下边超过定位点边界!";
                }
            }
        }
        if (GetData[4] != "")//主观题
        {
            string[] keguantiList = GetData[4].Split('^');
            foreach (string slist in keguantiList)
            {
                string[] list = slist.Split(',');
                Xleft = Convert.ToDouble(list[0]);
                Xtop = Convert.ToDouble(list[1]);
                Xwidth = Convert.ToDouble(list[2]);
                Xheight = Convert.ToDouble(list[3]);
                string tihao = list[4];
                if (Xleft < pyLeft)
                {
                    return "题号：[" + tihao + "] 编辑框左边超过定位点边界!";
                }
                if (Xleft + Xwidth - pyLeft > oldWidth)
                {
                    return "题号：[" + tihao + "] 编辑框右边超过定位点边界!";
                }
                if (Xtop < pyTop)
                {
                    return "题号：[" + tihao + "] 编辑框上边超过定位点边界!";
                }

                if (Xtop + Xheight - pyTop > oldHeight)
                {
                    return "题号：[" + tihao + "] 编辑框下边超过定位点边界!";
                }
            }
        }

        if (GetData[5] != "")
        {
            string[] list = GetData[5].Split(',');
            Xleft = Convert.ToDouble(list[0]);
            Xtop = Convert.ToDouble(list[1]);
            Xwidth = Convert.ToDouble(list[2]);
            Xheight = Convert.ToDouble(list[3]);
            if (Xleft < pyLeft)
            {
                return "条码编辑框左边超过定位点边界!";

            }
            if (Xleft + Xwidth - pyLeft > oldWidth)
            {
                return "条码编辑框右边超过定位点边界!";
            }
            if (Xtop < pyTop)
            {
                return "条码编辑框上边超过定位点边界!";
            }

            if (Xtop + Xheight - pyTop > oldHeight)
            {
                return "条码编辑框下边超过定位点边界!";
            }
        }

        if (GetData[7] != "")
        {
            string[] list = GetData[7].Split(',');
            Xleft = Convert.ToDouble(list[0]);
            Xtop = Convert.ToDouble(list[1]);
            Xwidth = Convert.ToDouble(list[2]);
            Xheight = Convert.ToDouble(list[3]);
            if (Xleft < pyLeft)
            {
                return "条码编辑框左边超过定位点边界!";

            }
            if (Xleft + Xwidth - pyLeft > oldWidth)
            {
                return "条码编辑框右边超过定位点边界!";
            }
            if (Xtop < pyTop)
            {
                return "条码编辑框上边超过定位点边界!";
            }

            if (Xtop + Xheight - pyTop > oldHeight)
            {
                return "条码编辑框下边超过定位点边界!";
            }
        }
        if (GetData[8] != "")
        {
            string[] list = GetData[8].Split(',');
            Xleft = Convert.ToDouble(list[0]);
            Xtop = Convert.ToDouble(list[1]);
            Xwidth = Convert.ToDouble(list[2]);
            Xheight = Convert.ToDouble(list[3]);
            if (Xleft < pyLeft)
            {
                return "批阅分数编辑框左边超过定位点边界!";

            }
            if (Xleft + Xwidth - pyLeft > oldWidth)
            {
                return "批阅分数编辑框编辑框右边超过定位点边界!";
            }
            if (Xtop < pyTop)
            {
                return "批阅分数编辑框编辑框上边超过定位点边界!";
            }

            if (Xtop + Xheight - pyTop > oldHeight)
            {
                return "批阅分数编辑框编辑框下边超过定位点边界!";
            }
        }
        if (HideAreaPostionList != "")
        {

            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            List<HideAreaData> ht = javaScriptSerializer.Deserialize<List<HideAreaData>>(HideAreaPostionList);
            int count = 0;
            foreach (HideAreaData h in ht)
            {
                count++;
                Xleft = Convert.ToDouble(h.left);
                Xtop = Convert.ToDouble(h.top);
                Xwidth = Convert.ToDouble(h.width);
                Xheight = Convert.ToDouble(h.height);
                if (Xleft < pyLeft)
                {
                    return "屏蔽区" + count + "编辑框左边超过定位点边界!";

                }
                if (Xleft + Xwidth - pyLeft > oldWidth)
                {
                    return "屏蔽区" + count + "编辑框右边超过定位点边界!";
                }
                if (Xtop < pyTop)
                {
                    return "屏蔽区" + count + "编辑框上边超过定位点边界!";
                }

                if (Xtop + Xheight - pyTop > oldHeight)
                {
                    return "屏蔽区" + count + "编辑框下边超过定位点边界!";
                }
            }
        }
        return "ok";
    }

    private Bitmap ScaleToSize(Bitmap bitmap, int width, int height)
    {
        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;
    }

    // <summary>
    /// 图片另存为
    /// </summary>
    /// <param name="url">路径</param>
    public Bitmap ImgGet(string url)
    {
        WebRequest imgRequest = WebRequest.Create(url);

        HttpWebResponse res;
        try
        {
            res = (HttpWebResponse)imgRequest.GetResponse();
        }
        catch (WebException ex)
        {

            res = (HttpWebResponse)ex.Response;
        }

        if (res.StatusCode.ToString() == "OK")
        {
            return new Bitmap((System.Drawing.Image)new Bitmap(imgRequest.GetResponse().GetResponseStream()));
        }
        else
        {
            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 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")
            {
                var tempbitmap = new Bitmap(imgRequest.GetResponse().GetResponseStream());

                // 别删！图片和网页中的方向不一致，根据图片中的方向信息，旋转图片后识别
                return new CommonUse().RotateByOrientation(tempbitmap);
            }
            else
            {
                return null;
            }
        }
        catch (WebException ex)
        {
            res = (HttpWebResponse)ex.Response;
            return null;
        }
        finally
        {
            if (res != null)
            {
                res.Dispose();
                res.Close();
            }
            imgRequest.Abort();
        }
    }



}


public class HideAreaData
{
    public Double width { get; set; }
    public Double height { get; set; }
    public Double left { get; set; }
    public Double top { get; set; }
}