/**************************************************************************** * @fn SaveImage * @brief 保存图片 * @param pSaveParam IN 保存图片配置参数结构体 * @return 成功:0;错误:-1 ****************************************************************************/ public int SaveImage(ref MyCamera.MV_SAVE_IMAGE_PARAM_EX pSaveParam) { int nRet; nRet = m_pCSI.MV_CC_SaveImageEx_NET(ref pSaveParam); return(nRet); }
/**************************************************************************** * @fn SaveImage * @brief 保存图片 * @param pSaveParam IN 保存图片配置参数结构体 * @return 成功:0;错误:-1 ****************************************************************************/ public int SaveImage(ref MyCamera.MV_SAVE_IMAGE_PARAM_EX pSaveParam) { int nRet; nRet = m_pCSI.MV_CC_SaveImageEx_NET(ref pSaveParam); if (MyCamera.MV_OK != nRet) { return(CO_FAIL); } return(CO_OK); }
private void ImageOut(IntPtr pixelPointer, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { try { MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = pFrameInfo.enPixelType; stSaveParam.pData = pixelPointer; stSaveParam.nDataLen = pFrameInfo.nFrameLen; stSaveParam.nHeight = pFrameInfo.nHeight; stSaveParam.nWidth = pFrameInfo.nWidth; stSaveParam.pImageBuffer = pBufForSave; stSaveParam.nBufferSize = nSaveSize; stSaveParam.nJpgQuality = 80; if (MyCamera.MV_OK != m_pOperator.SaveImage(ref stSaveParam)) { return; } //byte[] image = new byte[stSaveParam.nImageLen]; //Marshal.Copy(pBufForSave, image, 0, (int)stSaveParam.nImageLen); //FileStream file = new FileStream("image.bmp", FileMode.Create, FileAccess.Write); //file.Write(image, 0, (int)stSaveParam.nImageLen); //file.Close(); //Stopwatch sw = new Stopwatch(); //sw.Start(); //图像压缩 HImage hImage = new HImage("byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pixelPointer); HImage hNewImage = hImage.ZoomImageFactor(0.25, 0.25, "constant"); //4倍 Bitmap bImage = GenertateGrayBitmap(hNewImage); //bImage.Save("image.bmp"); byte[] image = GlobalFunction.ImageToBytes(bImage); //sw.Stop(); //TimeSpan ts2 = sw.Elapsed; //string info = "压缩总共花费" + ts2.TotalMilliseconds.ToString() + "ms."; //LogHelper.AppLoger.Info(info); ThrowImage(image); } catch { if (IsGrabEnd == false) { m_pOperator.StopGrabbing(); IsGrabEnd = true; } m_pOperator.Close(); } }
// ch:保存图片 | en:Save image private void SaveImage(IntPtr pData, MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo, int nIndex) { if ((3 * stFrameInfo.nFrameLen + 2048) > m_nBufSizeForSaveImage) { m_nBufSizeForSaveImage = 3 * stFrameInfo.nFrameLen + 2048; m_pBufForSaveImage = Marshal.AllocHGlobal((Int32)m_nBufSizeForSaveImage); } MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = stFrameInfo.enPixelType; stSaveParam.pData = pData; stSaveParam.nDataLen = stFrameInfo.nFrameLen; stSaveParam.nHeight = stFrameInfo.nHeight; stSaveParam.nWidth = stFrameInfo.nWidth; stSaveParam.pImageBuffer = m_pBufForSaveImage; stSaveParam.nBufferSize = m_nBufSizeForSaveImage; //stSaveParam.nJpgQuality = 80;//存Jpeg时有效 int nRet = m_pMyCamera[nIndex].MV_CC_SaveImageEx_NET(ref stSaveParam); if (MyCamera.MV_OK != nRet) { string temp = "No." + (nIndex + 1).ToString() + "Device save Failed!"; ShowErrorMsg(temp, 0); } else { string[] path = { "image1.bmp", "image2.bmp", "image3.bmp", "image4.bmp" }; Byte[] bArrBufForSaveImage = new Byte[stSaveParam.nImageLen]; Marshal.Copy(m_pBufForSaveImage, bArrBufForSaveImage, 0, (Int32)stSaveParam.nImageLen); Marshal.Release(m_pBufForSaveImage); FileStream file = new FileStream(path[nIndex], FileMode.Create, FileAccess.Write); file.Write(bArrBufForSaveImage, 0, (int)stSaveParam.nImageLen); file.Close(); string temp = "No." + (nIndex + 1).ToString() + "Device Save Succeed!"; ShowErrorMsg(temp, 0); } }
private void bnSaveJpg_Click(object sender, EventArgs e) { if (false == m_bGrabbing) { ShowErrorMsg("Not Start Grabbing", 0); return; } if (RemoveCustomPixelFormats(m_stFrameInfo.enPixelType)) { ShowErrorMsg("Not Support!", 0); return; } UInt32 nSaveImageNeedSize = m_nBufSizeForDriver * 3 + 2048; if (m_nBufSizeForSaveImage < nSaveImageNeedSize) { if (m_BufForSaveImage != IntPtr.Zero) { Marshal.Release(m_BufForSaveImage); } m_nBufSizeForSaveImage = nSaveImageNeedSize; m_BufForSaveImage = Marshal.AllocHGlobal((Int32)m_nBufSizeForSaveImage); } MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); lock (BufForDriverLock) { if (m_stFrameInfo.nFrameLen == 0) { ShowErrorMsg("Save Jpeg Fail!", 0); return; } IntPtr pJpgImage = m_BufForSaveImage; stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg; stSaveParam.enPixelType = m_stFrameInfo.enPixelType; stSaveParam.pData = m_BufForDriver; stSaveParam.nDataLen = m_stFrameInfo.nFrameLen; stSaveParam.nHeight = m_stFrameInfo.nHeight; stSaveParam.nWidth = m_stFrameInfo.nWidth; stSaveParam.pImageBuffer = pJpgImage; stSaveParam.nBufferSize = m_nBufSizeForSaveImage; stSaveParam.nJpgQuality = 80; int nRet = m_MyCamera.MV_CC_SaveImageEx_NET(ref stSaveParam); if (MyCamera.MV_OK != nRet) { ShowErrorMsg("Save Fail!", nRet); return; } } Byte[] bArrSaveImage = new Byte[stSaveParam.nImageLen]; Marshal.Copy(m_BufForSaveImage, bArrSaveImage, 0, (int)stSaveParam.nImageLen); try { FileStream file = new FileStream("image.jpg", FileMode.Create, FileAccess.Write); file.Write(bArrSaveImage, 0, (int)stSaveParam.nImageLen); file.Close(); } catch { ShowErrorMsg("Write File Fail!", 0); return; } ShowErrorMsg("Save Succeed!", 0); }
/// <summary>保存图像到文件中 </summary> public int Save(string filePath, JFImageSaveFileType fileType = JFImageSaveFileType.Bmp) { string dir = Path.GetDirectoryName(filePath); if (!Directory.Exists(dir)) { DirectoryInfo di = Directory.CreateDirectory(dir); if (di == null || !di.Exists) { return((int)ErrorDef.FolderUnExist); } } try { if (fileType == JFImageSaveFileType.Bmp || fileType == JFImageSaveFileType.Jpg) //调用Hik提供的功能 { int imgFileBuffLen = _frameInfo.nHeight * _frameInfo.nWidth * 3 + 2048; byte[] imgFileBytes = new byte[imgFileBuffLen]; IntPtr pBufImage = Marshal.UnsafeAddrOfPinnedArrayElement(imgFileBytes, 0); MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = (MyCamera.MV_SAVE_IAMGE_TYPE)(fileType + 1); stSaveParam.enPixelType = _frameInfo.enPixelType; stSaveParam.pData = Marshal.UnsafeAddrOfPinnedArrayElement(_dataBytes, 0);; stSaveParam.nDataLen = _frameInfo.nFrameLen; stSaveParam.nHeight = _frameInfo.nHeight; stSaveParam.nWidth = _frameInfo.nWidth; stSaveParam.pImageBuffer = pBufImage; stSaveParam.nBufferSize = (uint)(_frameInfo.nHeight * _frameInfo.nWidth * 3 + 2048); if (fileType == JFImageSaveFileType.Jpg) //if(stSaveParam.enImageType == MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg) { stSaveParam.nJpgQuality = 99; } int err = _cmr.MV_CC_SaveImageEx_NET(ref stSaveParam); if (MyCamera.MV_OK != err) { return((int)ErrorDef.InvokeFailed); } FileStream pFile = new FileStream(filePath, FileMode.Create); pFile.Write(imgFileBytes, 0, (int)stSaveParam.nImageLen); pFile.Close(); } else if (fileType == JFImageSaveFileType.Tif) { string fn = Path.GetFileNameWithoutExtension(filePath); if (string.IsNullOrEmpty(fn)) { return((int)ErrorDef.FolderUnExist); } object oimg; int ret = GenHalcon(out oimg); if (0 != ret) { return(ret); } string extension = Path.GetExtension(filePath); //if (string.IsNullOrEmpty(extension) || // 0 != string.Compare(".tiff", extension, true) || // 0 != string.Compare(".tif", extension, true)) // filePath += ".tiff"; //if (!string.IsNullOrEmpty(extension)) // 去掉后缀 // filePath = Path.GetFileNameWithoutExtension(filePath); HOperatorSet.WriteImage(oimg as HObject, "tiff", 0, filePath); (oimg as HObject).Dispose(); return((int)ErrorDef.Success); } else if (fileType == JFImageSaveFileType.Png) { string fn = Path.GetFileNameWithoutExtension(filePath); if (string.IsNullOrEmpty(fn)) { return((int)ErrorDef.FolderUnExist); } object oimg; int ret = GenHalcon(out oimg); if (0 != ret) { return(ret); } //string extension = Path.GetExtension(filePath); //if (string.IsNullOrEmpty(extension) || // 0 != string.Compare(".png", extension, true) ) // filePath += ".png"; HOperatorSet.WriteImage(oimg as HObject, "png", 0, filePath); (oimg as HObject).Dispose(); return((int)ErrorDef.Success); } else { return((int)ErrorDef.Unsupported); //throw new ArgumentException("不支持的图像存储格式:" + fileType.ToString()); } return((int)ErrorDef.Success); } catch { return((int)ErrorDef.FileExc); } }
static void Main(string[] args) { int nRet = MyCamera.MV_OK; MyCamera device = new MyCamera(); do { // ch:枚举设备 | en:Enum device MyCamera.MV_CC_DEVICE_INFO_LIST stDevList = new MyCamera.MV_CC_DEVICE_INFO_LIST(); nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref stDevList); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Enum device failed:{0:x8}", nRet); break; } Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum)); if (0 == stDevList.nDeviceNum) { break; } MyCamera.MV_CC_DEVICE_INFO stDevInfo; // 通用设备信息 // ch:打印设备信息 en:Print device info for (Int32 i = 0; i < stDevList.nDeviceNum; i++) { stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO)); if (MyCamera.MV_GIGE_DEVICE == stDevInfo.nTLayerType) { MyCamera.MV_GIGE_DEVICE_INFO stGigEDeviceInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO)); uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24); uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16); uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8); uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff); Console.WriteLine("\n" + i.ToString() + ": [GigE] User Define Name : " + stGigEDeviceInfo.chUserDefinedName); Console.WriteLine("device IP :" + nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4); } else if (MyCamera.MV_USB_DEVICE == stDevInfo.nTLayerType) { MyCamera.MV_USB3_DEVICE_INFO stUsb3DeviceInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO)); Console.WriteLine("\n" + i.ToString() + ": [U3V] User Define Name : " + stUsb3DeviceInfo.chUserDefinedName); Console.WriteLine("\n Serial Number : " + stUsb3DeviceInfo.chSerialNumber); Console.WriteLine("\n Device Number : " + stUsb3DeviceInfo.nDeviceNumber); } } Int32 nDevIndex = 0; Console.Write("\nPlease input index (0 -- {0:d}) : ", stDevList.nDeviceNum - 1); try { nDevIndex = Convert.ToInt32(Console.ReadLine()); } catch { Console.Write("Invalid Input!\n"); break; } if (nDevIndex > stDevList.nDeviceNum - 1 || nDevIndex < 0) { Console.Write("Input Error!\n"); break; } stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MyCamera.MV_CC_DEVICE_INFO)); // ch:创建设备 | en:Create device nRet = device.MV_CC_CreateDevice_NET(ref stDevInfo); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Create device failed:{0:x8}", nRet); break; } // ch:打开设备 | en:Open device nRet = device.MV_CC_OpenDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Open device failed:{0:x8}", nRet); break; } // ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera) if (stDevInfo.nTLayerType == MyCamera.MV_GIGE_DEVICE) { int nPacketSize = device.MV_CC_GetOptimalPacketSize_NET(); if (nPacketSize > 0) { nRet = device.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize); if (nRet != MyCamera.MV_OK) { Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet); } } else { Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize); } } // ch:设置触发模式为off || en:set trigger mode as off if (MyCamera.MV_OK != device.MV_CC_SetEnumValue_NET("TriggerMode", 0)) { Console.WriteLine("Set TriggerMode failed!"); break; } // ch:获取包大小 || en: Get Payload Size MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE(); nRet = device.MV_CC_GetIntValue_NET("PayloadSize", ref stParam); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Get PayloadSize failed:{0:x8}", nRet); break; } UInt32 nPayloadSize = stParam.nCurValue; // ch:开启抓图 | en:start grab nRet = device.MV_CC_StartGrabbing_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Start grabbing failed:{0:x8}", nRet); break; } int nCount = 0; IntPtr pBufForDriver = Marshal.AllocHGlobal((int)nPayloadSize); IntPtr pBufForSaveImage = IntPtr.Zero; MyCamera.MV_FRAME_OUT_INFO_EX FrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX(); while (nCount++ != 10) { nRet = device.MV_CC_GetOneFrameTimeout_NET(pBufForDriver, nPayloadSize, ref FrameInfo, 1000); // ch:获取一帧图像 | en:Get one image if (MyCamera.MV_OK == nRet) { Console.WriteLine("Get One Frame:" + "Width[" + Convert.ToString(FrameInfo.nWidth) + "] , Height[" + Convert.ToString(FrameInfo.nHeight) + "] , FrameNum[" + Convert.ToString(FrameInfo.nFrameNum) + "]"); if (pBufForSaveImage == IntPtr.Zero) { pBufForSaveImage = Marshal.AllocHGlobal((int)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048)); } MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = FrameInfo.enPixelType; stSaveParam.pData = pBufForDriver; stSaveParam.nDataLen = FrameInfo.nFrameLen; stSaveParam.nHeight = FrameInfo.nHeight; stSaveParam.nWidth = FrameInfo.nWidth; stSaveParam.pImageBuffer = pBufForSaveImage; stSaveParam.nBufferSize = (uint)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048); stSaveParam.nJpgQuality = 80; nRet = device.MV_CC_SaveImageEx_NET(ref stSaveParam); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Save Image failed:{0:x8}", nRet); continue; } // ch:将图像数据保存到本地文件 | en:Save image data to local file byte[] data = new byte[stSaveParam.nImageLen]; Marshal.Copy(pBufForSaveImage, data, 0, (int)stSaveParam.nImageLen); FileStream pFile = null; try { pFile = new FileStream("frame" + nCount.ToString() + ".bmp", FileMode.Create); pFile.Write(data, 0, data.Length); } catch { Console.WriteLine("保存图像失败"); } finally { pFile.Close(); } continue; } else { Console.WriteLine("No data:{0:x8}", nRet); } } Marshal.FreeHGlobal(pBufForDriver); Marshal.FreeHGlobal(pBufForSaveImage); // ch:停止抓图 | en:Stop grab image nRet = device.MV_CC_StopGrabbing_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Stop grabbing failed{0:x8}", nRet); break; } // ch:关闭设备 | en:Close device nRet = device.MV_CC_CloseDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Close device failed{0:x8}", nRet); break; } // ch:销毁设备 | en:Destroy device nRet = device.MV_CC_DestroyDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Destroy device failed:{0:x8}", nRet); break; } } while (false); if (MyCamera.MV_OK != nRet) { // ch:销毁设备 | en:Destroy device nRet = device.MV_CC_DestroyDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Destroy device failed:{0:x8}", nRet); } } Console.WriteLine("Press enter to exit"); Console.ReadKey(); }
static void Main(string[] args) { MyCamera.MV_CC_DEVICE_INFO stDevInfo = new MyCamera.MV_CC_DEVICE_INFO(); stDevInfo.nTLayerType = MyCamera.MV_GIGE_DEVICE; MyCamera.MV_GIGE_DEVICE_INFO stGigEDev = new MyCamera.MV_GIGE_DEVICE_INFO(); int nRet = MyCamera.MV_OK; MyCamera device = new MyCamera(); do { Console.Write("Please input Device Ip : "); string strCurrentIp = Convert.ToString(Console.ReadLine());// ch:需要连接的相机ip(根据实际填充) // en:The camera IP that needs to be connected (based on actual padding) Console.Write("Please input Net Export Ip : "); string strNetExport = Convert.ToString(Console.ReadLine()); // ch:相机对应的网卡ip(根据实际填充) // en:The pc IP that needs to be connected (based on actual padding) var parts = strCurrentIp.Split('.'); try { int nIp1 = Convert.ToInt32(parts[0]); int nIp2 = Convert.ToInt32(parts[1]); int nIp3 = Convert.ToInt32(parts[2]); int nIp4 = Convert.ToInt32(parts[3]); stGigEDev.nCurrentIp = (uint)((nIp1 << 24) | (nIp2 << 16) | (nIp3 << 8) | nIp4); parts = strNetExport.Split('.'); nIp1 = Convert.ToInt32(parts[0]); nIp2 = Convert.ToInt32(parts[1]); nIp3 = Convert.ToInt32(parts[2]); nIp4 = Convert.ToInt32(parts[3]); stGigEDev.nNetExport = (uint)((nIp1 << 24) | (nIp2 << 16) | (nIp3 << 8) | nIp4); } catch { Console.Write("Invalid Input!\n"); break; } // stGigEDev结构体转为stDevInfo.SpecialInfo.stGigEInfo(Byte[]) IntPtr stGigeInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(stGigEDev)); Marshal.StructureToPtr(stGigEDev, stGigeInfoPtr, false); stDevInfo.SpecialInfo.stGigEInfo = new Byte[Marshal.SizeOf(stDevInfo.SpecialInfo)]; Marshal.Copy(stGigeInfoPtr, stDevInfo.SpecialInfo.stGigEInfo, 0, Marshal.SizeOf(stDevInfo.SpecialInfo)); Marshal.Release(stGigeInfoPtr); // ch:创建设备 | en: Create device nRet = device.MV_CC_CreateDevice_NET(ref stDevInfo); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Create device failed:{0:x8}", nRet); break; } // ch:打开设备 | en:Open device nRet = device.MV_CC_OpenDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Open device failed:{0:x8}", nRet); break; } // ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera) if (stDevInfo.nTLayerType == MyCamera.MV_GIGE_DEVICE) { int nPacketSize = device.MV_CC_GetOptimalPacketSize_NET(); if (nPacketSize > 0) { nRet = device.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize); if (nRet != MyCamera.MV_OK) { Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet); } } else { Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize); } } // ch:设置触发模式为off || en:set trigger mode as off nRet = device.MV_CC_SetEnumValue_NET("TriggerMode", 0); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Set TriggerMode failed!"); break; } // ch:开启抓图 || en: start grab image nRet = device.MV_CC_StartGrabbing_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Start grabbing failed:{0:x8}", nRet); break; } // ch:获取包大小 || en: Get Payload Size MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE(); nRet = device.MV_CC_GetIntValue_NET("PayloadSize", ref stParam); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Get PayloadSize failed:{0:x8}", nRet); break; } UInt32 nPayloadSize = stParam.nCurValue; int nCount = 0; IntPtr pBufForDriver = Marshal.AllocHGlobal((int)nPayloadSize); // ch: 裸数据缓存 | en: raw data buff IntPtr pBufForSaveImage = IntPtr.Zero; // ch: 图片数据缓存 | en: Image data buff MyCamera.MV_FRAME_OUT_INFO_EX FrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX(); while (nCount++ != 10) { nRet = device.MV_CC_GetOneFrameTimeout_NET(pBufForDriver, nPayloadSize, ref FrameInfo, 1000); // ch:获取一帧图像 | en:Get one image if (MyCamera.MV_OK == nRet) { Console.WriteLine("Get One Frame: Width[{0}] , Height[{1}] , FrameNum[{2}]", FrameInfo.nWidth, FrameInfo.nHeight, FrameInfo.nFrameNum); if (pBufForSaveImage == IntPtr.Zero) { pBufForSaveImage = Marshal.AllocHGlobal((int)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048)); } MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = FrameInfo.enPixelType; stSaveParam.pData = pBufForDriver; stSaveParam.nDataLen = FrameInfo.nFrameLen; stSaveParam.nHeight = FrameInfo.nHeight; stSaveParam.nWidth = FrameInfo.nWidth; stSaveParam.pImageBuffer = pBufForSaveImage; stSaveParam.nBufferSize = (uint)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048); stSaveParam.nJpgQuality = 80; nRet = device.MV_CC_SaveImageEx_NET(ref stSaveParam); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Save Image failed:{0:x8}", nRet); continue; } // ch:将图像数据保存到本地文件 | en:Save image data to local file byte[] data = new byte[stSaveParam.nImageLen]; Marshal.Copy(pBufForSaveImage, data, 0, (int)stSaveParam.nImageLen); FileStream pFile = null; try { pFile = new FileStream("frame" + nCount.ToString() + ".bmp", FileMode.Create); pFile.Write(data, 0, data.Length); } catch { Console.WriteLine("保存失败"); continue; } finally { pFile.Close(); } } else { Console.WriteLine("No data:{0:x8}", nRet); break; } } Marshal.FreeHGlobal(pBufForDriver); Marshal.FreeHGlobal(pBufForSaveImage); // ch:停止抓图 | en:Stop grabbing nRet = device.MV_CC_StopGrabbing_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Stop grabbing failed{0:x8}", nRet); break; } // ch:关闭设备 | en:Close device nRet = device.MV_CC_CloseDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Close device failed{0:x8}", nRet); break; } // ch:销毁设备 | en:Destroy device nRet = device.MV_CC_DestroyDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Destroy device failed:{0:x8}", nRet); break; } } while (false); if (MyCamera.MV_OK != nRet) { // ch:销毁设备 | en:Destroy device nRet = device.MV_CC_DestroyDevice_NET(); if (MyCamera.MV_OK != nRet) { Console.WriteLine("Destroy device failed:{0:x8}", nRet); } } Console.WriteLine("Press enter to exit"); Console.ReadKey(); }