using NSOTSController; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace OTSSysMgrTools { public class ImageDispose { public ImageDispose() { } #region 通过byte数组生成BMP图像文件 /// /// 将一个byte的数组转换为8bit灰度位图 /// /// 数组 /// 图像宽度 /// 图像高度 /// 位图 public static Bitmap ToGrayBitmap(byte[] data, int width, int height) { //// 申请目标位图的变量,并将其内存区域锁定 Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); //// BitmapData这部分内容 需要 using System.Drawing.Imaging; BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); //// 获取图像参数 // 扫描线的宽度 int stride = bmpData.Stride; // 显示宽度与扫描线宽度的间隙 int offset = stride - width; // 获取bmpData的内存起始位置 IntPtr iptr = bmpData.Scan0; // 用stride宽度,表示这是内存区域的大小 int scanBytes = stride * height; //// 下面把原始的显示大小字节数组转换为内存中实际存放的字节数组 int posScan = 0; int posReal = 0;// 分别设置两个位置指针,指向源数组和目标数组 byte[] pixelValues = new byte[scanBytes]; //为目标数组分配内存 //for (int x = height-1;x>=0 ; x--) data[startIndex+ y];// for (int x = 0; x < height; x++) { int startIndex = x * width; //// 下面的循环节是模拟行扫描 for (int y = 0; y < width; y++) { pixelValues[posScan++] = data[posReal++]; } posScan += offset; //行扫描结束,要将目标位置指针移过那段“间隙” } //// 用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中 System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr, scanBytes); bmp.UnlockBits(bmpData); // 解锁内存区域 //// 下面的代码是为了修改生成位图的索引表,从伪彩修改为灰度 ColorPalette tempPalette; using (Bitmap tempBmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed)) { tempPalette = tempBmp.Palette; } for (int i = 0; i < 256; i++) { tempPalette.Entries[i] = Color.FromArgb(i, i, i); } bmp.Palette = tempPalette; //// 算法到此结束,返回结果 return bmp; } #endregion #region 将文件转换成byte[] 数组 /// /// 将文件转换成byte[] 数组 /// /// 文件路径文件名称 /// byte[] //public static byte[] GetFileData(string fileUrl) //{ // FileStream pFileStream = null; // byte[] pReadByte = new byte[0]; // try // { // //读取文本文件 // pFileStream = new FileStream(fileUrl, FileMode.Open, FileAccess.Read); // //实例读取字节流对象 // StreamReader sr = new StreamReader(pFileStream, System.Text.Encoding.Default); // string temp = sr.ReadToEnd(); // //转换byte数组 // byte[] byteArray = System.Text.Encoding.Default.GetBytes(temp); // //生成字符数组 // string[] tempGroup = temp.Split(','); // //关闭读取对象 // sr.Close(); // string AppendStr = string.Empty; // for (int i = 0; i < tempGroup.Length; i++) // { // //十进制转十六进制 // AppendStr += Convert.ToString(Convert.ToInt32(tempGroup[i]), 16) + " "; // } // //替换字符符号 // AppendStr = AppendStr.Replace(" ", ""); // if ((AppendStr.Length % 2) != 0) // { // AppendStr += " "; // } // byte[] returnBytes = new byte[AppendStr.Length / 2]; // //转换为byte[]数组 // for (int i = 0; i < returnBytes.Length; i++) // { // returnBytes[i] = Convert.ToByte(AppendStr.Substring(i * 2, 2), 16); // } // return returnBytes; // } // catch // { // return pReadByte; // } // finally // { // if (pFileStream != null) // pFileStream.Close(); // } //} #endregion #region 根据分辨率获取图像 //public static bool GetScanImage(string ImgWidth, string ImgHeight, string DwellTime, COTSControlFunExport cfun, ref byte[] ImageByte) //{ // try // { // //设置图像分辨率 // int width = 0; // int height = 0; // //获取宽度 // width = Convert.ToInt32(ImgWidth); // height = Convert.ToInt32(ImgHeight); // int a_ExternalMode = 0; // //获取终止模式 // a_ExternalMode = cfun.GetSemExternalMode(); // //保存初始模式变量 // int a_oldMode = 0; // //获取初始模式 // if (!cfun.GetSemScanMode(ref a_oldMode)) // { // return false; // } // //设置当前模式 // if (!cfun.SetSemScanMode(a_ExternalMode)) // { // return false; // } // #region BeamBlank // int a_nBeamBlank = 0; // //获取参数 // if (!cfun.GetSemBeamBlank(ref a_nBeamBlank)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // //设置参数 // if (!cfun.SetSemBeamBlank(0)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // #endregion // #region 获得放大倍数 // //获得放大倍数 // double a_dMagnification = 0; // //获取参数 // if (!cfun.GetSemMagnification(ref a_dMagnification)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // #endregion // #region 获取 电镜 X、Y轴 与角度 // //获取 电镜 X、Y轴 与角度 // double PositionX = 0; // double PositionY = 0; // double PositionR = 0; // //获取参数 // if (!cfun.GetSemPositionXY(ref PositionX, ref PositionY, ref PositionR)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // #endregion // #region 设置图像分辨率 // //设置宽度 // if (!cfun.SetImageSize(width, height)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // #endregion // #region 采集时间 // //采集时间 // int nDwellTime = 16; // nDwellTime = Convert.ToInt32(DwellTime); // //nDwellTime = Convert.ToInt32(tbCollectionTime.Text); // //设置采集时间 // if (!cfun.SetDwellTime(nDwellTime)) // { // cfun.SetSemScanMode(a_oldMode); // return false; // } // #endregion // #region MatrixSize // //获得放大倍数 // int a_MatrixSize = 0; // Size size = new Size(); // //获取参数 // size = cfun.GetMatrixSize(a_MatrixSize); // #endregion // //获取图像数据 // int resultCount = width * height; // int GetImgCount = cfun.AcquireBSEImage(0, 0, 0, ref ImageByte); // if (resultCount == GetImgCount) // { // //设置为原始 扫描模式 // cfun.SetSemScanMode(a_oldMode); // } // else // { // cfun.SetSemScanMode(a_oldMode); // } // return true; // } // catch (Exception ex) // { // //记录日志 // //NLog.Logger log = NLog.LogManager.GetCurrentClassLogger(); // // log.Error(ex.Message.ToString()); // return false; // } //} #endregion public static int GetScanImage(int iWidth, int iHeigh, string DwellTime, ref byte[] bImageData) { //电镜设置对象 COTSControlFunExport cfun = new COTSControlFunExport(); int GetImgCount = 0; try { //连接电镜 bool IsConnec = cfun.ConncetSem(); if (!IsConnec) { return 0; } //实例电镜初始化 bool IsScan = cfun.ScanInit(); if (!IsScan) { return 0; } int a_ExternalMode = 0; //获取终止模式 a_ExternalMode = cfun.GetSemExternalMode(); //保存初始模式变量 int a_oldMode = 0; //获取初始模式 if (!cfun.GetSemScanMode(ref a_oldMode)) { return 0; } //设置当前模式 if (!cfun.SetSemScanMode(a_ExternalMode)) { return 0; } #region BeamBlank int a_nBeamBlank = 0; //获取参数 if (!cfun.GetSemBeamBlank(ref a_nBeamBlank)) { cfun.SetSemScanMode(a_oldMode); return 0; } //设置参数 if (!cfun.SetSemBeamBlank(0)) { cfun.SetSemScanMode(a_oldMode); return 0; } #endregion #region 获得放大倍数 //获得放大倍数 double a_dMagnification = 0; //m_MsrApp.m_LogFunExport.TraceLog("APP_GetSemMagnification-----begin------"); //获取参数 if (!cfun.GetSemMagnification(ref a_dMagnification)) { cfun.SetSemScanMode(a_oldMode); return 0; } //m_MsrApp.m_LogFunExport.TraceLog("APP_GetSemMagnification_a_dMagnification:" + a_dMagnification + "------"); //m_MsrApp.m_LogFunExport.TraceLog("APP_GetSemMagnification-----end------"); #endregion #region 获取 电镜 X、Y轴 与角度 //获取 电镜 X、Y轴 与角度 double PositionX = 0; double PositionY = 0; double PositionR = 0; //获取参数 if (!cfun.GetSemPositionXY(ref PositionX, ref PositionY, ref PositionR)) { cfun.SetSemScanMode(a_oldMode); return 0; } #endregion #region 设置图像分辨率 //设置宽度 if (!cfun.SetImageSize(iWidth, iHeigh)) { cfun.SetSemScanMode(a_oldMode); return 0; } #endregion #region 采集时间 //采集时间 int nDwellTime = Convert.ToInt32(DwellTime); //设置采集时间 if (!cfun.SetDwellTime(nDwellTime)) { cfun.SetSemScanMode(a_oldMode); return 0; } #endregion #region MatrixSize //获得放大倍数 int a_MatrixSize = 0; Size size = new Size(); //获取参数 size = cfun.GetMatrixSize(a_MatrixSize); #endregion //获取图像数据 int resultCount = iWidth * iHeigh; GetImgCount = cfun.AcquireBSEImage(0, 0, 0, ref bImageData); //记录日志 if (resultCount == GetImgCount) { //设置为原始 扫描模式 cfun.SetSemScanMode(a_oldMode); //Scan类结束 //初始化电镜参数 //if (!cfun.SetAndStartScan()) //{ // return 0; //} } else { cfun.SetSemScanMode(a_oldMode); //记录日志 //初始化电镜参数 //if (!cfun.SetAndStartScan()) //{ // return 0; //} } } catch (Exception ex) { throw ex; } finally { //cfun.ScanFinishedInstance(); //cfun.DisConnectSem(); //cfun.FreeDll(); } return GetImgCount; } /// /// 将byte数组转换为文件并保存到指定地址 /// /// byte数组 /// 保存地址 //public static void BytesConvertToFile(byte[] buff, string savepath, string fileName) //{ // try // { // //如果不存在就创建Enclosure文件夹 // if (Directory.Exists(savepath + @"\Enclosure\") == false) // { // Directory.CreateDirectory(savepath + @"\Enclosure\"); // } // if (System.IO.File.Exists(savepath + @"\Enclosure\" + fileName)) // { // System.IO.File.Delete(savepath + @"\Enclosure\" + fileName); // } // Bitmap bitmap=ToGrayBitmap(buff, 1024, 768); // bitmap.Save(savepath + @"\Enclosure\" + fileName); // } // catch (Exception) // { // } //} } }