using OTSCLRINTERFACE; using OTSModelSharp.ServiceInterface; 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 OTSSysMgrApp { public class Imagepro { public Imagepro() { } #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 public static int GetScanImage(int iWidth, int iHeigh, string DwellTime, ref byte[] bImageData) { if(FileHelper.GetXMLInformations("SemControllerName") == "FEI") { ScanController m_ScanHardwareMgr = ScanController.GetScanController(); m_ScanHardwareMgr.Init(); m_ScanHardwareMgr.SetImageSize(iWidth, iHeigh); bImageData = m_ScanHardwareMgr.AcquireBSEImage(0, 0, int.Parse(DwellTime)).GetImageDataPtr(); return 1; } else { //电镜设置对象 var cfun = COTSControlFunExport.GetControllerInstance(); 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(false)) { 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); } else { cfun.SetSemScanMode(a_oldMode); } } catch (Exception ex) { throw ex; } return GetImgCount; } } } }