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;
}
}
}
}