Explorar o código

提交缺少的文件

zty %!s(int64=3) %!d(string=hai) anos
pai
achega
a57387c104
Modificáronse 1 ficheiros con 231 adicións e 0 borrados
  1. 231 0
      OTSSysMgrApp/Imagepro.cs

+ 231 - 0
OTSSysMgrApp/Imagepro.cs

@@ -0,0 +1,231 @@
+
+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图像文件
+        /// <summary>    
+        /// 将一个byte的数组转换为8bit灰度位图
+        /// </summary>    
+        /// <param name="data">数组</param>    
+        /// <param name="width">图像宽度</param>    
+        /// <param name="height">图像高度</param>    
+        /// <returns>位图</returns>    
+        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;
+            }
+        }
+    }
+}