예제 #1
0
        /****************************************************************************
        * @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);
        }
예제 #2
0
        /****************************************************************************
        * @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);
        }
예제 #3
0
        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();
            }
        }
예제 #4
0
        // 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);
            }
        }
예제 #5
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);
        }
예제 #6
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);
            }
        }
예제 #7
0
파일: GrabImage.cs 프로젝트: HUT-17/HUT
        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();
        }
예제 #8
0
        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();
        }