Files
Z714System/外科辅料和患者防护罩激光抗性测试仪/BasicDemo/BasicDemo.cs
2026-01-05 19:21:33 +08:00

999 lines
42 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MvCamCtrl.NET;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using System.Drawing.Imaging;
using System.Diagnostics;
using System.Collections.ObjectModel;
namespace BasicDemo
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
private static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
// ch:判断用户自定义像素格式 | en:Determine custom pixel format
public const Int32 CUSTOMER_PIXEL_FORMAT = unchecked((Int32)0x80000000);
MyCamera.MV_CC_DEVICE_INFO_LIST m_stDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST();
private MyCamera m_MyCamera = new MyCamera();
bool m_bGrabbing = false;
Thread m_hReceiveThread = null;
MyCamera.MV_FRAME_OUT_INFO_EX m_stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
// ch:用于从驱动获取图像的缓存 | en:Buffer for getting image from driver
UInt32 m_nBufSizeForDriver = 0;
IntPtr m_BufForDriver = IntPtr.Zero;
private static Object BufForDriverLock = new Object();
// ch:Bitmap及其像素格式 | en:Bitmap and Pixel Format
Bitmap m_bitmap = null;
PixelFormat m_bitmapPixelFormat = PixelFormat.DontCare;
IntPtr m_ConvertDstBuf = IntPtr.Zero;
UInt32 m_nConvertDstBufLen = 0;
IntPtr displayHandle = IntPtr.Zero;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
this.Load += new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
// ch: 初始化 SDK | en: Initialize SDK
MyCamera.MV_CC_Initialize_NET();
// ch: 枚举设备 | en: Enum Device List
DeviceListAcq();
}
// ch:显示错误信息 | en:Show error message
private void ShowErrorMsg(string csMessage, int nErrorNum)
{
string errorMsg;
if (nErrorNum == 0)
{
errorMsg = csMessage;
}
else
{
errorMsg = csMessage + ": Error =" + String.Format("{0:X}", nErrorNum);
}
switch (nErrorNum)
{
case MyCamera.MV_E_HANDLE: errorMsg += " Error or invalid handle "; break;
case MyCamera.MV_E_SUPPORT: errorMsg += " Not supported function "; break;
case MyCamera.MV_E_BUFOVER: errorMsg += " Cache is full "; break;
case MyCamera.MV_E_CALLORDER: errorMsg += " Function calling order error "; break;
case MyCamera.MV_E_PARAMETER: errorMsg += " Incorrect parameter "; break;
case MyCamera.MV_E_RESOURCE: errorMsg += " Applying resource failed "; break;
case MyCamera.MV_E_NODATA: errorMsg += " No data "; break;
case MyCamera.MV_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break;
case MyCamera.MV_E_VERSION: errorMsg += " Version mismatches "; break;
case MyCamera.MV_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break;
case MyCamera.MV_E_UNKNOW: errorMsg += " Unknown error "; break;
case MyCamera.MV_E_GC_GENERIC: errorMsg += " General error "; break;
case MyCamera.MV_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break;
case MyCamera.MV_E_ACCESS_DENIED: errorMsg += " No permission "; break;
case MyCamera.MV_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break;
case MyCamera.MV_E_NETER: errorMsg += " Network error "; break;
}
MessageBox.Show(errorMsg, "PROMPT");
}
private string DeleteTail(string strUserDefinedName)
{
strUserDefinedName = Regex.Unescape(strUserDefinedName);
int nIndex = strUserDefinedName.IndexOf("\0");
if (nIndex >= 0)
{
strUserDefinedName = strUserDefinedName.Remove(nIndex);
}
return strUserDefinedName;
}
private Boolean IsMonoData(MyCamera.MvGvspPixelType enGvspPixelType)
{
switch (enGvspPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
return true;
default:
return false;
}
}
/************************************************************************
* @fn IsColorData()
* @brief 判断是否是彩色数据
* @param enGvspPixelType [IN] 像素格式
* @return 成功返回0错误返回-1
************************************************************************/
private Boolean IsColorData(MyCamera.MvGvspPixelType enGvspPixelType)
{
switch (enGvspPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
return true;
default:
return false;
}
}
private void bnEnum_Click(object sender, EventArgs e)
{
DeviceListAcq();
}
private void DeviceListAcq()
{
// ch:创建设备列表 | en:Create Device List
System.GC.Collect();
cbDeviceList.Items.Clear();
m_stDeviceList.nDeviceNum = 0;
//这里枚举了所有类型,根据实际情况,选择合适的枚举类型即可
int nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE | MyCamera.MV_GENTL_GIGE_DEVICE
| MyCamera.MV_GENTL_CAMERALINK_DEVICE | MyCamera.MV_GENTL_CXP_DEVICE | MyCamera.MV_GENTL_XOF_DEVICE, ref m_stDeviceList);
if (0 != nRet)
{
ShowErrorMsg("Enumerate devices fail!",0);
return;
}
// ch:在窗体列表中显示设备名 | en:Display device name in the form list
for (int i = 0; i < m_stDeviceList.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
string strUserDefinedName = "";
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
MyCamera.MV_GIGE_DEVICE_INFO_EX gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO_EX)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO_EX));
if ((gigeInfo.chUserDefinedName.Length > 0) && (gigeInfo.chUserDefinedName[0] != '\0'))
{
if (MyCamera.IsTextUTF8(gigeInfo.chUserDefinedName))
{
strUserDefinedName = Encoding.UTF8.GetString(gigeInfo.chUserDefinedName).TrimEnd('\0');
}
else
{
strUserDefinedName = Encoding.Default.GetString(gigeInfo.chUserDefinedName).TrimEnd('\0');
}
cbDeviceList.Items.Add("GEV: " + DeleteTail(strUserDefinedName) + " (" + gigeInfo.chSerialNumber + ")");
}
else
{
cbDeviceList.Items.Add("GEV: " + gigeInfo.chManufacturerName + " " + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")");
}
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
MyCamera.MV_USB3_DEVICE_INFO_EX usbInfo = (MyCamera.MV_USB3_DEVICE_INFO_EX)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO_EX));
if ((usbInfo.chUserDefinedName.Length > 0) && (usbInfo.chUserDefinedName[0] != '\0'))
{
if (MyCamera.IsTextUTF8(usbInfo.chUserDefinedName))
{
strUserDefinedName = Encoding.UTF8.GetString(usbInfo.chUserDefinedName).TrimEnd('\0');
}
else
{
strUserDefinedName = Encoding.Default.GetString(usbInfo.chUserDefinedName).TrimEnd('\0');
}
cbDeviceList.Items.Add("U3V: " + DeleteTail(strUserDefinedName) + " (" + usbInfo.chSerialNumber + ")");
}
else
{
cbDeviceList.Items.Add("U3V: " + usbInfo.chManufacturerName + " " + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")");
}
}
else if (device.nTLayerType == MyCamera.MV_GENTL_CAMERALINK_DEVICE)
{
MyCamera.MV_CML_DEVICE_INFO CMLInfo = (MyCamera.MV_CML_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stCMLInfo, typeof(MyCamera.MV_CML_DEVICE_INFO));
if ((CMLInfo.chUserDefinedName.Length > 0) && (CMLInfo.chUserDefinedName[0] != '\0'))
{
if (MyCamera.IsTextUTF8(CMLInfo.chUserDefinedName))
{
strUserDefinedName = Encoding.UTF8.GetString(CMLInfo.chUserDefinedName).TrimEnd('\0');
}
else
{
strUserDefinedName = Encoding.Default.GetString(CMLInfo.chUserDefinedName).TrimEnd('\0');
}
cbDeviceList.Items.Add("CML: " + DeleteTail(strUserDefinedName) + " (" + CMLInfo.chSerialNumber + ")");
}
else
{
cbDeviceList.Items.Add("CML: " + CMLInfo.chManufacturerInfo + " " + CMLInfo.chModelName + " (" + CMLInfo.chSerialNumber + ")");
}
}
else if (device.nTLayerType == MyCamera.MV_GENTL_CXP_DEVICE)
{
MyCamera.MV_CXP_DEVICE_INFO CXPInfo = (MyCamera.MV_CXP_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stCXPInfo, typeof(MyCamera.MV_CXP_DEVICE_INFO));
if ((CXPInfo.chUserDefinedName.Length > 0) && (CXPInfo.chUserDefinedName[0] != '\0'))
{
if (MyCamera.IsTextUTF8(CXPInfo.chUserDefinedName))
{
strUserDefinedName = Encoding.UTF8.GetString(CXPInfo.chUserDefinedName).TrimEnd('\0');
}
else
{
strUserDefinedName = Encoding.Default.GetString(CXPInfo.chUserDefinedName).TrimEnd('\0');
}
cbDeviceList.Items.Add("CXP: " + DeleteTail(strUserDefinedName) + " (" + CXPInfo.chSerialNumber + ")");
}
else
{
cbDeviceList.Items.Add("CXP: " + CXPInfo.chManufacturerInfo + " " + CXPInfo.chModelName + " (" + CXPInfo.chSerialNumber + ")");
}
}
else if (device.nTLayerType == MyCamera.MV_GENTL_XOF_DEVICE)
{
MyCamera.MV_XOF_DEVICE_INFO XOFInfo = (MyCamera.MV_XOF_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stXoFInfo, typeof(MyCamera.MV_XOF_DEVICE_INFO));
if ((XOFInfo.chUserDefinedName.Length > 0) && (XOFInfo.chUserDefinedName[0] != '\0'))
{
if (MyCamera.IsTextUTF8(XOFInfo.chUserDefinedName))
{
strUserDefinedName = Encoding.UTF8.GetString(XOFInfo.chUserDefinedName).TrimEnd('\0');
}
else
{
strUserDefinedName = Encoding.Default.GetString(XOFInfo.chUserDefinedName).TrimEnd('\0');
}
cbDeviceList.Items.Add("XOF: " + DeleteTail(strUserDefinedName) + " (" + XOFInfo.chSerialNumber + ")");
}
else
{
cbDeviceList.Items.Add("XOF: " + XOFInfo.chManufacturerInfo + " " + XOFInfo.chModelName + " (" + XOFInfo.chSerialNumber + ")");
}
}
}
// ch:选择第一项 | en:Select the first item
if (m_stDeviceList.nDeviceNum != 0)
{
cbDeviceList.SelectedIndex = 0;
}
}
private void SetCtrlWhenOpen()
{
bnOpen.Enabled = false;
bnClose.Enabled = true;
bnStartGrab.Enabled = true;
bnStopGrab.Enabled = false;
bnContinuesMode.Enabled = true;
bnContinuesMode.Checked = true;
bnTriggerMode.Enabled = true;
cbSoftTrigger.Enabled = false;
bnTriggerExec.Enabled = false;
tbExposure.Enabled = true;
tbGain.Enabled = true;
tbFrameRate.Enabled = true;
bnGetParam.Enabled = true;
bnSetParam.Enabled = true;
}
private void bnOpen_Click(object sender, EventArgs e)
{
if (m_stDeviceList.nDeviceNum == 0 || cbDeviceList.SelectedIndex == -1)
{
ShowErrorMsg("No device, please select", 0);
return;
}
// ch:获取选择的设备信息 | en:Get selected device information
MyCamera.MV_CC_DEVICE_INFO device =
(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[cbDeviceList.SelectedIndex],
typeof(MyCamera.MV_CC_DEVICE_INFO));
// ch:打开设备 | en:Open device
if (null == m_MyCamera)
{
m_MyCamera = new MyCamera();
if (null == m_MyCamera)
{
ShowErrorMsg("Applying resource fail!", MyCamera.MV_E_RESOURCE);
return;
}
}
int nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Create device fail!", nRet);
return;
}
nRet = m_MyCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
m_MyCamera.MV_CC_DestroyDevice_NET();
ShowErrorMsg("Device open fail!", nRet);
return;
}
// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = m_MyCamera.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0)
{
nRet = m_MyCamera.MV_CC_SetIntValueEx_NET("GevSCPSPacketSize", nPacketSize);
if (nRet != MyCamera.MV_OK)
{
ShowErrorMsg("Set Packet Size failed!", nRet);
}
}
else
{
ShowErrorMsg("Get Packet Size failed!", nPacketSize);
}
}
// ch:设置采集连续模式 | en:Set Continues Acquisition Mode
m_MyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", (uint)MyCamera.MV_CAM_ACQUISITION_MODE.MV_ACQ_MODE_CONTINUOUS);
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);
bnGetParam_Click(null, null);// ch:获取参数 | en:Get parameters
// ch:控件操作 | en:Control operation
SetCtrlWhenOpen();
}
private void SetCtrlWhenClose()
{
bnOpen.Enabled = true;
bnClose.Enabled = false;
bnStartGrab.Enabled = false;
bnStopGrab.Enabled = false;
bnContinuesMode.Enabled = false;
bnTriggerMode.Enabled = false;
cbSoftTrigger.Enabled = false;
bnTriggerExec.Enabled = false;
bnSaveBmp.Enabled = false;
bnSaveJpg.Enabled = false;
bnSaveTiff.Enabled = false;
bnSavePng.Enabled = false;
tbExposure.Enabled = false;
tbGain.Enabled = false;
tbFrameRate.Enabled = false;
bnGetParam.Enabled = false;
bnSetParam.Enabled = false;
}
private void bnClose_Click(object sender, EventArgs e)
{
// ch:取流标志位清零 | en:Reset flow flag bit
if (m_bGrabbing == true)
{
m_bGrabbing = false;
m_hReceiveThread.Join();
}
if (m_BufForDriver != IntPtr.Zero)
{
Marshal.Release(m_BufForDriver);
}
if (m_MyCamera != null)
{
// ch:关闭设备 | en:Close Device
m_MyCamera.MV_CC_CloseDevice_NET();
m_MyCamera.MV_CC_DestroyDevice_NET();
}
// ch:控件操作 | en:Control Operation
SetCtrlWhenClose();
}
private void bnContinuesMode_CheckedChanged(object sender, EventArgs e)
{
if (bnContinuesMode.Checked)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);
cbSoftTrigger.Enabled = false;
bnTriggerExec.Enabled = false;
}
}
private void bnTriggerMode_CheckedChanged(object sender, EventArgs e)
{
// ch:打开触发模式 | en:Open Trigger Mode
if (bnTriggerMode.Checked)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
// ch:触发源选择:0 - Line0; | en:Trigger source select:0 - Line0;
// 1 - Line1;
// 2 - Line2;
// 3 - Line3;
// 4 - Counter;
// 7 - Software;
if (cbSoftTrigger.Checked)
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
if (m_bGrabbing)
{
bnTriggerExec.Enabled = true;
}
}
else
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);
}
cbSoftTrigger.Enabled = true;
}
}
private void SetCtrlWhenStartGrab()
{
bnStartGrab.Enabled = false;
bnStopGrab.Enabled = true;
if (bnTriggerMode.Checked && cbSoftTrigger.Checked)
{
bnTriggerExec.Enabled = true;
}
bnSaveBmp.Enabled = true;
bnSaveJpg.Enabled = true;
bnSaveTiff.Enabled = true;
bnSavePng.Enabled = true;
}
public void ReceiveThreadProcess()
{
MyCamera.MV_FRAME_OUT stFrameInfo = new MyCamera.MV_FRAME_OUT();
MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
MyCamera.MV_PIXEL_CONVERT_PARAM stConvertInfo = new MyCamera.MV_PIXEL_CONVERT_PARAM();
int nRet = MyCamera.MV_OK;
while (m_bGrabbing)
{
nRet = m_MyCamera.MV_CC_GetImageBuffer_NET(ref stFrameInfo, 1000);
if (nRet == MyCamera.MV_OK)
{
lock (BufForDriverLock)
{
if (m_BufForDriver == IntPtr.Zero || stFrameInfo.stFrameInfo.nFrameLen > m_nBufSizeForDriver)
{
if (m_BufForDriver != IntPtr.Zero)
{
Marshal.Release(m_BufForDriver);
m_BufForDriver = IntPtr.Zero;
}
m_BufForDriver = Marshal.AllocHGlobal((Int32)stFrameInfo.stFrameInfo.nFrameLen);
if (m_BufForDriver == IntPtr.Zero)
{
return;
}
m_nBufSizeForDriver = stFrameInfo.stFrameInfo.nFrameLen;
}
m_stFrameInfo = stFrameInfo.stFrameInfo;
CopyMemory(m_BufForDriver, stFrameInfo.pBufAddr, stFrameInfo.stFrameInfo.nFrameLen);
// ch:转换像素格式 | en:Convert Pixel Format
stConvertInfo.nWidth = stFrameInfo.stFrameInfo.nWidth;
stConvertInfo.nHeight = stFrameInfo.stFrameInfo.nHeight;
stConvertInfo.enSrcPixelType = stFrameInfo.stFrameInfo.enPixelType;
stConvertInfo.pSrcData = stFrameInfo.pBufAddr;
stConvertInfo.nSrcDataLen = stFrameInfo.stFrameInfo.nFrameLen;
stConvertInfo.pDstBuffer = m_ConvertDstBuf;
stConvertInfo.nDstBufferSize = m_nConvertDstBufLen;
if (PixelFormat.Format8bppIndexed == m_bitmap.PixelFormat)
{
stConvertInfo.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8;
m_MyCamera.MV_CC_ConvertPixelType_NET(ref stConvertInfo);
}
else
{
stConvertInfo.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed;
m_MyCamera.MV_CC_ConvertPixelType_NET(ref stConvertInfo);
}
// ch:保存Bitmap数据 | en:Save Bitmap Data
BitmapData bitmapData = m_bitmap.LockBits(new Rectangle(0, 0, stConvertInfo.nWidth, stConvertInfo.nHeight), ImageLockMode.ReadWrite, m_bitmap.PixelFormat);
CopyMemory(bitmapData.Scan0, stConvertInfo.pDstBuffer, (UInt32)(bitmapData.Stride * m_bitmap.Height));
m_bitmap.UnlockBits(bitmapData);
}
stDisplayInfo.hWnd = displayHandle;
stDisplayInfo.pData = stFrameInfo.pBufAddr;
stDisplayInfo.nDataLen = stFrameInfo.stFrameInfo.nFrameLen;
stDisplayInfo.nWidth = stFrameInfo.stFrameInfo.nWidth;
stDisplayInfo.nHeight = stFrameInfo.stFrameInfo.nHeight;
stDisplayInfo.enPixelType = stFrameInfo.stFrameInfo.enPixelType;
m_MyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
m_MyCamera.MV_CC_FreeImageBuffer_NET(ref stFrameInfo);
}
else
{
if (bnTriggerMode.Checked)
{
Thread.Sleep(5);
}
}
}
}
// ch:像素类型是否为Mono格式 | en:If Pixel Type is Mono
private Boolean IsMono(UInt32 enPixelType)
{
switch (enPixelType)
{
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono1p:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono2p:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono4p:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8_Signed:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono14:
case (UInt32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono16:
return true;
default:
return false;
}
}
// ch:取图前的必要操作步骤 | en:Necessary operation before grab
private Int32 NecessaryOperBeforeGrab()
{
// ch:取图像宽 | en:Get Iamge Width
MyCamera.MVCC_INTVALUE_EX stWidth = new MyCamera.MVCC_INTVALUE_EX();
int nRet = m_MyCamera.MV_CC_GetIntValueEx_NET("Width", ref stWidth);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Get Width Info Fail!", nRet);
return nRet;
}
// ch:取图像高 | en:Get Iamge Height
MyCamera.MVCC_INTVALUE_EX stHeight = new MyCamera.MVCC_INTVALUE_EX();
nRet = m_MyCamera.MV_CC_GetIntValueEx_NET("Height", ref stHeight);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Get Height Info Fail!", nRet);
return nRet;
}
// ch:取像素格式 | en:Get Pixel Format
MyCamera.MVCC_ENUMVALUE stPixelFormat = new MyCamera.MVCC_ENUMVALUE();
nRet = m_MyCamera.MV_CC_GetEnumValue_NET("PixelFormat", ref stPixelFormat);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Get Pixel Format Fail!", nRet);
return nRet;
}
// ch:设置bitmap像素格式申请相应大小内存 | en:Set Bitmap Pixel Format, alloc memory
if ((Int32)MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined == (Int32)stPixelFormat.nCurValue)
{
ShowErrorMsg("Unknown Pixel Format!", MyCamera.MV_E_UNKNOW);
return MyCamera.MV_E_UNKNOW;
}
else if (IsMono(stPixelFormat.nCurValue))
{
m_bitmapPixelFormat = PixelFormat.Format8bppIndexed;
if (IntPtr.Zero != m_ConvertDstBuf)
{
Marshal.Release(m_ConvertDstBuf);
m_ConvertDstBuf = IntPtr.Zero;
}
// Mono8为单通道
m_nConvertDstBufLen = (UInt32)(stWidth.nCurValue * stHeight.nCurValue);
m_ConvertDstBuf = Marshal.AllocHGlobal((Int32)m_nConvertDstBufLen);
if (IntPtr.Zero == m_ConvertDstBuf)
{
ShowErrorMsg("Malloc Memory Fail!", MyCamera.MV_E_RESOURCE);
return MyCamera.MV_E_RESOURCE;
}
}
else
{
m_bitmapPixelFormat = PixelFormat.Format24bppRgb;
if (IntPtr.Zero != m_ConvertDstBuf)
{
Marshal.FreeHGlobal(m_ConvertDstBuf);
m_ConvertDstBuf = IntPtr.Zero;
}
// RGB为三通道
m_nConvertDstBufLen = (UInt32)(3 * stWidth.nCurValue * stHeight.nCurValue);
m_ConvertDstBuf = Marshal.AllocHGlobal((Int32)m_nConvertDstBufLen);
if (IntPtr.Zero == m_ConvertDstBuf)
{
ShowErrorMsg("Malloc Memory Fail!", MyCamera.MV_E_RESOURCE);
return MyCamera.MV_E_RESOURCE;
}
}
// 确保释放保存了旧图像数据的bitmap实例用新图像宽高等信息new一个新的bitmap实例
if (null != m_bitmap)
{
m_bitmap.Dispose();
m_bitmap = null;
}
m_bitmap = new Bitmap((Int32)stWidth.nCurValue, (Int32)stHeight.nCurValue, m_bitmapPixelFormat);
// ch:Mono8格式设置为标准调色板 | en:Set Standard Palette in Mono8 Format
if (PixelFormat.Format8bppIndexed == m_bitmapPixelFormat)
{
ColorPalette palette = m_bitmap.Palette;
for (int i = 0; i < palette.Entries.Length; i++)
{
palette.Entries[i] = Color.FromArgb(i, i, i);
}
m_bitmap.Palette = palette;
}
return MyCamera.MV_OK;
}
private void bnStartGrab_Click(object sender, EventArgs e)
{
// ch:前置配置 | en:pre-operation
int nRet = NecessaryOperBeforeGrab();
if (MyCamera.MV_OK != nRet)
{
return;
}
displayHandle = pictureBox1.Handle;
// ch:标志位置true | en:Set position bit true
m_bGrabbing = true;
m_stFrameInfo.nFrameLen = 0;//取流之前先清除帧长度
m_stFrameInfo.enPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined;
m_hReceiveThread = new Thread(ReceiveThreadProcess);
m_hReceiveThread.Start();
// ch:开始采集 | en:Start Grabbing
nRet = m_MyCamera.MV_CC_StartGrabbing_NET();
if (MyCamera.MV_OK != nRet)
{
m_bGrabbing = false;
m_hReceiveThread.Join();
ShowErrorMsg("Start Grabbing Fail!", nRet);
return;
}
// ch:控件操作 | en:Control Operation
SetCtrlWhenStartGrab();
}
private void cbSoftTrigger_CheckedChanged(object sender, EventArgs e)
{
if (cbSoftTrigger.Checked)
{
// ch:触发源设为软触发 | en:Set trigger source as Software
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
if (m_bGrabbing)
{
bnTriggerExec.Enabled = true;
}
}
else
{
m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);
bnTriggerExec.Enabled = false;
}
}
private void bnTriggerExec_Click(object sender, EventArgs e)
{
// ch:触发命令 | en:Trigger command
int nRet = m_MyCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Trigger Software Fail!", nRet);
}
}
private void SetCtrlWhenStopGrab()
{
bnStartGrab.Enabled = true;
bnStopGrab.Enabled = false;
bnTriggerExec.Enabled = false;
bnSaveBmp.Enabled = false;
bnSaveJpg.Enabled = false;
bnSaveTiff.Enabled = false;
bnSavePng.Enabled = false;
}
private void bnStopGrab_Click(object sender, EventArgs e)
{
// ch:标志位设为false | en:Set flag bit false
m_bGrabbing = false;
m_hReceiveThread.Join();
// ch:停止采集 | en:Stop Grabbing
int nRet = m_MyCamera.MV_CC_StopGrabbing_NET();
if (nRet != MyCamera.MV_OK)
{
ShowErrorMsg("Stop Grabbing Fail!" , nRet);
}
// ch:控件操作 | en:Control Operation
SetCtrlWhenStopGrab();
}
private void bnSaveBmp_Click(object sender, EventArgs e)
{
if (false == m_bGrabbing)
{
ShowErrorMsg("Not Start Grabbing", 0);
return;
}
MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();
lock (BufForDriverLock)
{
if (m_stFrameInfo.nFrameLen == 0)
{
ShowErrorMsg("Save Bmp Fail!", 0);
return;
}
stSaveFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp;
stSaveFileParam.enPixelType = m_stFrameInfo.enPixelType;
stSaveFileParam.pData = m_BufForDriver;
stSaveFileParam.nDataLen = m_stFrameInfo.nFrameLen;
stSaveFileParam.nHeight = m_stFrameInfo.nHeight;
stSaveFileParam.nWidth = m_stFrameInfo.nWidth;
stSaveFileParam.iMethodValue = 2;
stSaveFileParam.pImagePath = "Image_w" + stSaveFileParam.nWidth.ToString() + "_h" + stSaveFileParam.nHeight.ToString() + "_fn" + m_stFrameInfo.nFrameNum.ToString() + ".bmp";
int nRet = m_MyCamera.MV_CC_SaveImageToFile_NET(ref stSaveFileParam);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Save Bmp Fail!", nRet);
return;
}
}
ShowErrorMsg("Save Succeed!", 0);
}
private void bnSaveJpg_Click(object sender, EventArgs e)
{
if (false == m_bGrabbing)
{
ShowErrorMsg("Not Start Grabbing", 0);
return;
}
MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();
lock (BufForDriverLock)
{
if (m_stFrameInfo.nFrameLen == 0)
{
ShowErrorMsg("Save Jpeg Fail!", 0);
return;
}
stSaveFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg;
stSaveFileParam.enPixelType = m_stFrameInfo.enPixelType;
stSaveFileParam.pData = m_BufForDriver;
stSaveFileParam.nDataLen = m_stFrameInfo.nFrameLen;
stSaveFileParam.nHeight = m_stFrameInfo.nHeight;
stSaveFileParam.nWidth = m_stFrameInfo.nWidth;
stSaveFileParam.nQuality = 80;
stSaveFileParam.iMethodValue = 2;
stSaveFileParam.pImagePath = "Image_w" + stSaveFileParam.nWidth.ToString() + "_h" + stSaveFileParam.nHeight.ToString() + "_fn" + m_stFrameInfo.nFrameNum.ToString() + ".jpg";
int nRet = m_MyCamera.MV_CC_SaveImageToFile_NET(ref stSaveFileParam);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Save Jpeg Fail!", nRet);
return;
}
}
ShowErrorMsg("Save Succeed!", 0);
}
private void bnSavePng_Click(object sender, EventArgs e)
{
if (false == m_bGrabbing)
{
ShowErrorMsg("Not Start Grabbing", 0);
return;
}
MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();
lock (BufForDriverLock)
{
if (m_stFrameInfo.nFrameLen == 0)
{
ShowErrorMsg("Save Png Fail!", 0);
return;
}
stSaveFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Png;
stSaveFileParam.enPixelType = m_stFrameInfo.enPixelType;
stSaveFileParam.pData = m_BufForDriver;
stSaveFileParam.nDataLen = m_stFrameInfo.nFrameLen;
stSaveFileParam.nHeight = m_stFrameInfo.nHeight;
stSaveFileParam.nWidth = m_stFrameInfo.nWidth;
stSaveFileParam.nQuality = 8;
stSaveFileParam.iMethodValue = 2;
stSaveFileParam.pImagePath = "Image_w" + stSaveFileParam.nWidth.ToString() + "_h" + stSaveFileParam.nHeight.ToString() + "_fn" + m_stFrameInfo.nFrameNum.ToString() + ".png";
int nRet = m_MyCamera.MV_CC_SaveImageToFile_NET(ref stSaveFileParam);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Save Png Fail!", nRet);
return;
}
}
ShowErrorMsg("Save Succeed!", 0);
}
private void bnSaveTiff_Click(object sender, EventArgs e)
{
if (false == m_bGrabbing)
{
ShowErrorMsg("Not Start Grabbing", 0);
return;
}
MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();
lock (BufForDriverLock)
{
if (m_stFrameInfo.nFrameLen == 0)
{
ShowErrorMsg("Save Tiff Fail!", 0);
return;
}
stSaveFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Tif;
stSaveFileParam.enPixelType = m_stFrameInfo.enPixelType;
stSaveFileParam.pData = m_BufForDriver;
stSaveFileParam.nDataLen = m_stFrameInfo.nFrameLen;
stSaveFileParam.nHeight = m_stFrameInfo.nHeight;
stSaveFileParam.nWidth = m_stFrameInfo.nWidth;
stSaveFileParam.iMethodValue = 2;
stSaveFileParam.pImagePath = "Image_w" + stSaveFileParam.nWidth.ToString() + "_h" + stSaveFileParam.nHeight.ToString() + "_fn" + m_stFrameInfo.nFrameNum.ToString() + ".tif";
int nRet = m_MyCamera.MV_CC_SaveImageToFile_NET(ref stSaveFileParam);
if (MyCamera.MV_OK != nRet)
{
ShowErrorMsg("Save Tiff Fail!", nRet);
return;
}
}
ShowErrorMsg("Save Succeed!", 0);
}
private void bnGetParam_Click(object sender, EventArgs e)
{
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
int nRet = m_MyCamera.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
if (MyCamera.MV_OK == nRet)
{
tbExposure.Text = stParam.fCurValue.ToString("F1");
}
nRet = m_MyCamera.MV_CC_GetFloatValue_NET("Gain", ref stParam);
if (MyCamera.MV_OK == nRet)
{
tbGain.Text = stParam.fCurValue.ToString("F1");
}
nRet = m_MyCamera.MV_CC_GetFloatValue_NET("ResultingFrameRate", ref stParam);
if (MyCamera.MV_OK == nRet)
{
tbFrameRate.Text = stParam.fCurValue.ToString("F1");
}
}
private void bnSetParam_Click(object sender, EventArgs e)
{
try
{
float.Parse(tbExposure.Text);
float.Parse(tbGain.Text);
float.Parse(tbFrameRate.Text);
}
catch
{
ShowErrorMsg("Please enter correct type!", 0);
return;
}
m_MyCamera.MV_CC_SetEnumValue_NET("ExposureAuto", 0);
int nRet = m_MyCamera.MV_CC_SetFloatValue_NET("ExposureTime", float.Parse(tbExposure.Text));
if (nRet != MyCamera.MV_OK)
{
ShowErrorMsg("Set Exposure Time Fail!", nRet);
}
m_MyCamera.MV_CC_SetEnumValue_NET("GainAuto", 0);
nRet = m_MyCamera.MV_CC_SetFloatValue_NET("Gain", float.Parse(tbGain.Text));
if (nRet != MyCamera.MV_OK)
{
ShowErrorMsg("Set Gain Fail!", nRet);
}
nRet = m_MyCamera.MV_CC_SetFloatValue_NET("AcquisitionFrameRate", float.Parse(tbFrameRate.Text));
if (nRet != MyCamera.MV_OK)
{
ShowErrorMsg("Set Frame Rate Fail!", nRet);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// ch: 关闭设备 | en: Close Device
bnClose_Click(sender, e);
// ch: 反初始化SDK | en: Finalize SDK
MyCamera.MV_CC_Finalize_NET();
}
}
}