/// <summary>
        /// Create By Xu In 2018.09.21
        /// Edit By Xu In 2018.10.23 // Add BitMap.Dispose();
        /// Function : Split Img To 3 Channals
        /// Warming  :The Picture Bit Depth Must Be 24(Format24bppRgb) Now.
        /// </summary>
        /// <param name="strFileName"></param>
        /// <param name="stReadImgData"></param>
        private void LoadSplitImg(string strFileName, ref ST_SaveOrLoadImgData stReadImgData)
        {
            if (strFileName == null && stReadImgData.bUseOpcv == true)
            {
                return;
            }
            Bitmap image = new Bitmap(strFileName);

            stReadImgData.iWidth  = image.Width;
            stReadImgData.iHeight = image.Height;
            int iLength = stReadImgData.iWidth * stReadImgData.iHeight;

            System.Drawing.Imaging.BitmapData data = image.LockBits(new Rectangle(0, 0, stReadImgData.iWidth, stReadImgData.iHeight), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            unsafe
            {
                byte *ptr = (byte *)(data.Scan0);
                stReadImgData.byImgDataR = new byte[iLength];
                stReadImgData.byImgDataG = new byte[iLength];
                stReadImgData.byImgDataB = new byte[iLength];
                byte *ptr_b;
                byte *ptr_g;
                byte *ptr_r;
                ptr_b = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataB, 0);
                ptr_g = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataG, 0);
                ptr_r = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataR, 0);
                int index   = 0;
                int iOffset = data.Stride - data.Width * 3;
                if (iOffset == 0)
                {
                    for (int i = 0; i < stReadImgData.iHeight; i++)
                    {
                        for (int j = 0; j < stReadImgData.iWidth; j++)
                        {
                            index = i * stReadImgData.iWidth + j;
                            *ptr_b++ = *ptr++;
                            *ptr_g++ = *ptr++;
                            *ptr_r++ = *ptr++;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < stReadImgData.iHeight; i++)
                    {
                        for (int j = 0; j < stReadImgData.iWidth; j++)
                        {
                            index = i * stReadImgData.iWidth + j;
                            *ptr_b++ = *ptr++;
                            *ptr_g++ = *ptr++;
                            *ptr_r++ = *ptr++;
                        }
                        ptr += iOffset;
                    }
                }
            }
            image.Dispose();//Edit By Xu In 2018.10.23
        }
        /// <summary>
        /// Create By Xu In 2018.09.21
        /// Function : Split Bmp File To Three Byte[] Of RGB,Fastest;
        /// Warming  :1.May Exit Bug,If Err,Use Normal Method.
        ///            2.The Picture' Width And Height Must Less Than 256* 256 * 256.If Need Longer Length,You Can Change stReadImgData.iWidth(iHeight) Value;
        ///            3.The Picture Bit Depth Must Be 24(Format24bppRgb) Now.
        /// </summary>
        /// <param name="strFileName"></param>
        /// <param name="stReadImgData"></param>
        private void FastLoadSplitBmp(string strFileName, ref ST_SaveOrLoadImgData stReadImgData)
        {
            try
            {
                if (strFileName == null || stReadImgData.iImgFormat != 0)
                {
                    return;
                }

                Stream stream = File.OpenRead(strFileName);
                byte[] buffer = new byte[stream.Length];
                stream.Position = 0;
                stream.Read(buffer, 0, buffer.Length);
                stReadImgData.iWidth  = buffer[20] * 256 * 256 + buffer[19] * 256 + buffer[18];
                stReadImgData.iHeight = buffer[24] * 256 * 256 + buffer[23] * 256 + buffer[22];
                int iLength = stReadImgData.iWidth * stReadImgData.iHeight;
                stReadImgData.byImgDataR = new byte[iLength];
                stReadImgData.byImgDataG = new byte[iLength];
                stReadImgData.byImgDataB = new byte[iLength];
                int index2 = 0;
                int j = 0;
                int i = 0, ii = stReadImgData.iHeight - 1;
                int iSingleLength = stReadImgData.iWidth * 3;
                int iOffset       = (iSingleLength / 4 + 1) * 4 - iSingleLength;
                if (iOffset % 4 == 0)
                {
                    iOffset = 0;
                }
                unsafe
                {
                    byte *ptr_b;
                    byte *ptr_g;
                    byte *ptr_r;
                    ptr_b = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataB, 0);
                    ptr_g = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataG, 0);
                    ptr_r = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stReadImgData.byImgDataR, 0);
                    for (; i < stReadImgData.iHeight; i++, ii--)
                    {
                        index2 = ii * (iSingleLength + iOffset) + 54;
                        for (j = 0; j < stReadImgData.iWidth; j++)
                        {
                            *ptr_b++ = buffer[index2++];
                            *ptr_g++ = buffer[index2++];
                            *ptr_r++ = buffer[index2++];
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return;
        }
        /// <summary>
        /// Create By Xu In 2018.09.29
        /// Edit By Xu In 2018.10.23 //Add BitMap.Dispose();
        /// Edit By Xu In 2018_10_29 //strFileName -> strFilePath ,Meaning You Need't Add ".FileFormat" In "strFilePath" But Must Assign ST_SaveOrLoadImgData.iImgFormat To Figure Out File Format;
        /// Function: Save Img To Native.
        /// </summary>
        /// <param name="strFileName">FilePath+FileName</param>
        /// <param name="stReadImgData">ST_SaveOrLoadImgData</param>
        /// <param name="iImgQuality">Low 0->100 High</param>
        /// <returns></returns>
        public string SaveImg(string strFilePath, ST_SaveOrLoadImgData stSaveImgData, int iImgQuality)
        {
            string strMsg      = string.Empty;
            string strFileName = string.Empty;

            try
            {
                if (strFilePath == null)
                {
                    return("FilePath_Is_Null");
                }

                switch (stSaveImgData.iImgFormat)//Edit By Xu In 2018_10_30
                {
                case 0:
                    if (
                        (strFilePath[strFilePath.Length - 4] == 46) &&    //"."
                        (strFilePath[strFilePath.Length - 3] == 98 || strFilePath[strFilePath.Length - 3] == 66) &&    //"bB"
                        (strFilePath[strFilePath.Length - 2] == 109 || strFilePath[strFilePath.Length - 2] == 77) &&    //"mM"
                        (strFilePath[strFilePath.Length - 1] == 112 || strFilePath[strFilePath.Length - 1] == 80)       //"pP"
                        )
                    {
                        strFileName = strFilePath;
                    }
                    else
                    {
                        strFileName = strFilePath + ".bmp";
                    }

                    break;

                case 1:
                    if (
                        (strFilePath[strFilePath.Length - 4] == 46) &&
                        (strFilePath[strFilePath.Length - 3] == 106 || strFilePath[strFilePath.Length - 3] == 74) &&    //"jJ"
                        (strFilePath[strFilePath.Length - 2] == 112 || strFilePath[strFilePath.Length - 2] == 80) &&    //"pP"
                        (strFilePath[strFilePath.Length - 1] == 103 || strFilePath[strFilePath.Length - 1] == 71)       //"gG"
                        )
                    {
                        strFileName = strFilePath;
                    }
                    else
                    {
                        strFileName = strFilePath + ".jpg";
                    }
                    break;

                case 2:
                    SaveImg(strFilePath, stSaveImgData);    //.imgdat
                    return("Format_Is_.imgdat");

                default:
                    return("File_Format_Params_Err");
                }

                if (stSaveImgData.iImgFormat == 0 && stSaveImgData.bUseOpcv == true)
                {
                    byte[]  byFileName  = System.Text.Encoding.Default.GetBytes(strFileName);
                    float[] AfarrParams = new float[3];
                    AfarrParams[0] = (float)strFileName.Length;
                    AfarrParams[1] = (float)stSaveImgData.iWidth;
                    AfarrParams[2] = (float)stSaveImgData.iHeight;

                    _cvFunc.SaveImgByOpcv(byFileName, stSaveImgData.byImgDataR, stSaveImgData.byImgDataG, stSaveImgData.byImgDataB, AfarrParams);
                    return(strMsg);
                }
                Bitmap bmp = new Bitmap(stSaveImgData.iWidth, stSaveImgData.iHeight, PixelFormat.Format24bppRgb);

                int iWidth  = stSaveImgData.iWidth;
                int iHeight = stSaveImgData.iHeight;
                int iLength = iWidth * iHeight;
                //获取图像的BitmapData对像
                System.Drawing.Imaging.BitmapData data = bmp.LockBits(new Rectangle(0, 0, iWidth, iHeight), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                //循环处理
                unsafe
                {
                    int   iOffset = data.Stride - data.Width * 3;
                    byte *ptr     = (byte *)(data.Scan0);
                    byte *ptr_b;
                    byte *ptr_g;
                    byte *ptr_r;
                    ptr_b = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stSaveImgData.byImgDataB, 0);
                    ptr_g = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stSaveImgData.byImgDataG, 0);
                    ptr_r = (byte *)System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(stSaveImgData.byImgDataR, 0);
                    if (iOffset == 0)
                    {
                        for (int i = 0; i < iLength; i++)
                        {
                            *ptr++ = *ptr_b++;
                            *ptr++ = *ptr_g++;
                            *ptr++ = *ptr_r++;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < iHeight; i++)
                        {
                            for (int j = 0; j < iWidth; j++)
                            {
                                *ptr++ = *ptr_b++;
                                *ptr++ = *ptr_g++;
                                *ptr++ = *ptr_r++;
                            }
                            ptr += iOffset;
                        }
                    }
                }

                switch (stSaveImgData.iImgFormat)
                {
                case 0:
                    bmp.Save(strFileName, System.Drawing.Imaging.ImageFormat.Bmp);
                    break;

                case 1:
                    EncoderParameter  p;
                    EncoderParameters ps;

                    ps = new EncoderParameters(1);
                    if (iImgQuality > 100)
                    {
                        iImgQuality = 100;
                    }
                    else if (iImgQuality < 0)
                    {
                        iImgQuality = 80;
                    }
                    p           = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, iImgQuality);
                    ps.Param[0] = p;
                    bmp.Save(strFileName, GetCodecInfo("image/jpeg"), ps);
                    break;

                default:
                    bmp.Save(strFileName, System.Drawing.Imaging.ImageFormat.Bmp);
                    break;
                }
                bmp.Dispose();//Edit By Xu In 2018.10.23
            }

            catch (Exception e)
            {
                strMsg += "SaveImgErr" + e.Message.ToString();
            }
            return(strMsg);
        }
        /// <summary>
        /// Create By Xu In 2018.09.21
        /// Edit By Xu In 2018_10_29 :strFileName -> strFilePath ,Meaning You Need't Add ".FileFormat" In "strFilePath" But Must Assign ST_SaveOrLoadImgData.iImgFormat To Figure Out File Format;
        /// Function: Load And Split Img To 3 Channels.
        /// Warming : 1.The Picture Bit Depth Must Be 24(Format24bppRgb) Now.
        ///           2.Only Support Bmp And Jpg/Jpeg;
        /// </summary>
        /// <param name="strFileName">FilePath+FileName</param>
        /// <param name="stReadImgData">ST_SaveOrLoadImgData</param>
        /// <returns></returns>
        public string LoadImg(string strFilePath, ref ST_SaveOrLoadImgData stReadImgData)
        {
            string strMsg      = string.Empty;
            string strFileName = string.Empty;

            try
            {
                if (strFileName == null)
                {
                    return("FilePath_Is_Null");
                }

                switch (stReadImgData.iImgFormat)//Edit By Xu In 2018_10_30
                {
                case 0:
                    if (
                        (strFilePath[strFilePath.Length - 4] == 46) &&      //"."
                        (strFilePath[strFilePath.Length - 3] == 98 || strFilePath[strFilePath.Length - 3] == 66) &&       //"bB"
                        (strFilePath[strFilePath.Length - 2] == 109 || strFilePath[strFilePath.Length - 2] == 77) &&      //"mM"
                        (strFilePath[strFilePath.Length - 1] == 112 || strFilePath[strFilePath.Length - 1] == 80)         //"pP"
                        )
                    {
                        strFileName = strFilePath;
                    }
                    else
                    {
                        strFileName = strFilePath + ".bmp";
                    }

                    break;

                case 1:
                    if (
                        (strFilePath[strFilePath.Length - 4] == 46) &&
                        (strFilePath[strFilePath.Length - 3] == 106 || strFilePath[strFilePath.Length - 3] == 74) &&    //"jJ"
                        (strFilePath[strFilePath.Length - 2] == 112 || strFilePath[strFilePath.Length - 2] == 80) &&    //"pP"
                        (strFilePath[strFilePath.Length - 1] == 103 || strFilePath[strFilePath.Length - 1] == 71)       //"gG"
                        )
                    {
                        strFileName = strFilePath;
                    }
                    else
                    {
                        strFileName = strFilePath + ".jpg";
                    }
                    break;

                case 2:
                    LoadImadat(strFilePath, ref stReadImgData);    //.imgdat
                    return("Format_Is_.imgdat");

                default:
                    return("File_Format_Params_Err");
                }

                if (stReadImgData.iImgFormat == 0 && stReadImgData.bUseOpcv == true)
                {
                    byte[]  FilePath    = System.Text.Encoding.Default.GetBytes(strFileName);
                    float[] AfarrParams = new float[3];//Edit By Xu In 2018_10_31 int->float
                    AfarrParams[0] = (float)FilePath.Length;

                    // ST_SaveOrLoadImgData stReadImgdata = new ST_SaveOrLoadImgData();

                    _cvFunc.LoadImgByOpcv(FilePath, ref stReadImgData.byImgDataR, ref stReadImgData.byImgDataG, ref stReadImgData.byImgDataB, AfarrParams);
                    stReadImgData.iWidth  = (int)AfarrParams[1];
                    stReadImgData.iHeight = (int)AfarrParams[2];
                }
                else if (stReadImgData.iImgFormat == 0 && stReadImgData.bUseFastLoadBmp == true)
                {
                    FastLoadSplitBmp(strFileName, ref stReadImgData);
                }

                else
                {
                    LoadSplitImg(strFileName, ref stReadImgData);
                }
            }
            catch (Exception e)
            {
                strMsg += "LoadImgErr" + e.Message.ToString();
            }
            return(strMsg);
        }
        /// <summary>
        /// Create By Xu In 2018_10_26
        /// Load Data From ..FileName.imgdat
        /// </summary>
        /// <param name="strFilePath"></param>
        /// <param name="stSaveImgData"></param>
        /// <returns></returns>
        public string LoadImadat(string strFilePath, ref ST_SaveOrLoadImgData stSaveImgData)//Edit By Xu In 2018_10_29 Add ref
        {
            string     strMsg = string.Empty;
            Stream     stream = null;
            FileStream fs     = null;

            if (stSaveImgData.iImgFormat != 2)
            {
                return(strMsg + "LoadImgParamsErr");
            }

            string strFileName = string.Empty;

            if (
                (strFilePath[strFilePath.Length - 7] == 46) &&//"."
                (strFilePath[strFilePath.Length - 6] == 105 || strFilePath[strFilePath.Length - 5] == 109) &&//"im"
                (strFilePath[strFilePath.Length - 4] == 103 || strFilePath[strFilePath.Length - 3] == 100) &&//"gd"
                (strFilePath[strFilePath.Length - 2] == 97 || strFilePath[strFilePath.Length - 1] == 116)  //"at"
                )
            {
                strFileName = strFilePath;
            }
            else
            {
                strFileName = strFilePath + ".imgdat";
            }

            try
            {
                fs = new FileStream(strFileName, FileMode.OpenOrCreate, FileAccess.Read);
                byHeadData.Initialize();
                fs.Read(byHeadData, 0, 20);
                if (byHeadData[0] != 20 || (byHeadData[2] != 3 && byHeadData[2] != 2))//Edit By Xu In 2018_10_29 : 位数:2->3
                {
                    return("Not_Surpported_Head_Data_Format.imgdat");
                }
                if (3 == byHeadData[2])
                {
                    stSaveImgData.iWidth  = byHeadData[3] * 65536 + byHeadData[4] * 256 + byHeadData[5];
                    stSaveImgData.iHeight = byHeadData[6] * 65536 + byHeadData[7] * 256 + byHeadData[8];
                }
                else
                if (2 == byHeadData[2])
                {
                    stSaveImgData.iWidth  = byHeadData[3] * 256 + byHeadData[4];
                    stSaveImgData.iHeight = byHeadData[5] * 256 + byHeadData[6];
                }
                else
                {
                    return("Not_Surpported_Head_Data_Format.imgdat");
                }
                int iLength = stSaveImgData.iHeight * stSaveImgData.iWidth;
                if (stSaveImgData.byImgDataR == null || stSaveImgData.byImgDataR.Length != iLength)
                {
                    stSaveImgData.byImgDataR = new byte[iLength];
                    stSaveImgData.byImgDataG = new byte[iLength];
                    stSaveImgData.byImgDataB = new byte[iLength];
                }

                fs.Position = 20;
                fs.Read(stSaveImgData.byImgDataR, 0, iLength);
                fs.Position = 20 + iLength;
                fs.Read(stSaveImgData.byImgDataG, 0, iLength);
                fs.Position = 20 + iLength * 2;
                fs.Read(stSaveImgData.byImgDataB, 0, iLength);
            }
            catch (Exception e)
            {
                strMsg += "LoadImgErr" + e.Message.ToString();
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }

                if (stream != null)
                {
                    stream.Dispose();
                }
            }
            return(strMsg);
        }
        /// <summary>
        /// Create By Xu In 2018_10_26
        /// Save Image Data To  ..FileName.imgdat
        /// Edit By Xu In 2018_10_29 长宽所占的位数由2->3
        /// </summary>
        /// <param name="strFileName"></param>
        /// <param name="stSaveImgData"></param>
        /// <returns></returns>
        public string SaveImg(string strFilePath, ST_SaveOrLoadImgData stSaveImgData)
        {
            string strMsg = string.Empty;
            Stream stream = null;

            if (stSaveImgData.iImgFormat != 2)
            {
                return(strMsg + "SaveImgParamsErr");
            }
            string strFileName = string.Empty;

            if (
                (strFilePath[strFilePath.Length - 7] == 46) &&//"."
                (strFilePath[strFilePath.Length - 6] == 105 || strFilePath[strFilePath.Length - 5] == 109) &&//"im"
                (strFilePath[strFilePath.Length - 4] == 103 || strFilePath[strFilePath.Length - 3] == 100) &&//"gd"
                (strFilePath[strFilePath.Length - 2] == 97 || strFilePath[strFilePath.Length - 1] == 116)   //"at"
                )
            {
                strFileName = strFilePath;
            }
            else
            {
                strFileName = strFilePath + ".imgdat";
            }
            try
            {
                int iLength = stSaveImgData.iHeight * stSaveImgData.iWidth;
                stream = new MemoryStream(stSaveImgData.byImgDataB);
                byte[] byDataHead = new byte[20];
                byDataHead[0] = 20;                                    //HeadLength
                byDataHead[1] = 0;                                     //是否加密
                byDataHead[2] = 3;                                     //Width Height 所占的byte位数  Edit By Xu In 2018_10_29 : 位数:2->3

                byDataHead[3] = (byte)(stSaveImgData.iWidth / 65536);  //高位
                byDataHead[4] = (byte)(stSaveImgData.iWidth % 65536 / 256);
                byDataHead[5] = (byte)(stSaveImgData.iWidth % 256);    //低位

                byDataHead[6] = (byte)(stSaveImgData.iHeight / 65536); //高位
                byDataHead[7] = (byte)(stSaveImgData.iHeight % 65536 / 256);
                byDataHead[8] = (byte)(stSaveImgData.iHeight % 256);   //低位

                //byDataHead[5] = (byte)(stSaveImgData.iHeight / 256);//高位
                // byDataHead[6] = (byte)(stSaveImgData.iHeight % 256);//低位

                FileStream fs = new FileStream(strFileName, FileMode.OpenOrCreate);
                fs.Write(byDataHead, 0, 20);
                fs.Write(stSaveImgData.byImgDataR, 0, iLength);
                fs.Write(stSaveImgData.byImgDataG, 0, iLength);
                fs.Write(stSaveImgData.byImgDataB, 0, iLength);

                fs.Close();
            }
            catch (Exception e)
            {
                strMsg += "SaveImgErr" + e.Message.ToString();
            }
            finally
            {
                if (stream != null)
                {
                    stream.Dispose();
                }
            }
            return(strMsg);
        }