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