using PaintDotNet.Setting; using System; using System.Collections.Generic; using System.Drawing; using System.Runtime.InteropServices; using System.Threading; using TUCAMAPI; using TUCamera; namespace PaintDotNet.ImageCollect.CameraManager { internal class MIChrome5Pro : CameraPublic { public bool m_isWaiting; public bool m_isRecording = false; public Thread m_waitingThread; public TUCAM_FRAME m_frame; public TUCAM_TRIGGER_ATTR m_triggerAttr = new TUCAM_TRIGGER_ATTR(); public SetValueDel setValueDel; public CameraPreviewDialog cameraPreviewDialog; public CameraSettingDialog cameraSettingDialog; byte[] pBuf = null; object lockObj = new object(); private TUCAM_OPEN m_handler; public TUCamera.TUCamera m_currentCamera; public CameraPreviewDialog CameraPreviewDialog { set { this.cameraPreviewDialog = value; } } public CameraSettingDialog CameraSettingDialog { set { this.cameraSettingDialog = value; } } public SetValueDel SetValueDel { set { this.setValueDel = value; } } public MIChrome5Pro() { m_currentCamera = TUCameraManager.GetInstance().GetCurrentCamera(); m_handler = m_currentCamera.GetHandler(); } /// /// 初始化 /// public override void Init() { this.m_isRecording = false; this.m_triggerAttr.nTgrMode = (int)TUCAM_CAPTURE_MODES.TUCCM_SEQUENCE; this.m_triggerAttr.nFrames = 1; this.m_triggerAttr.nDelayTm = 0; this.m_triggerAttr.nExpMode = (int)TUCAM_TRIGGER_EXP.TUCTE_EXPTM; this.m_triggerAttr.nEdgeMode = (int)TUCAM_TRIGGER_EDGE.TUCTD_RISING; } /// /// 释放 /// public override void Uninit() { //关闭所有打开的 m_currentCamera.Close(); } /// /// 开始预览 /// /// public override void StartPreview() { this.StartWaitForFrame(this.m_handler); } /// /// 停止预览 /// public override void StopPreview() { if (this.m_isWaiting) this.StopWaitForFrame(this.m_handler); } /// /// 获取当前分辨率 /// /// public unsafe override Size GetCurrentResolution() { /* Size size = new Size(); TUCAM_VALUE_INFO valueInfo = new TUCAM_VALUE_INFO(); valueInfo.nID = (int)TUCAM_IDINFO.TUIDI_CURRENT_WIDTH; TUCamAPI.TUCAM_Dev_GetInfo(this.m_opCamList[this.m_indexCam].hIdxTUCam, ref valueInfo); size.Width = valueInfo.nValue; valueInfo.nID = (int)TUCAM_IDINFO.TUIDI_CURRENT_HEIGHT; TUCamAPI.TUCAM_Dev_GetInfo(this.m_opCamList[this.m_indexCam].hIdxTUCam, ref valueInfo); size.Height = valueInfo.nValue; return size; */ return m_currentCamera.GetResolution(); } public void StopWaitForFrame(TUCAM_OPEN opCam) { if (!m_isWaiting) { return; } if (m_currentCamera.IsOpen()) { m_isWaiting = false; TUCamAPI.TUCAM_Buf_AbortWait(opCam.hIdxTUCam); //m_waitingThread.Join();//存疑 m_waitingThread.Abort(); TUCamAPI.TUCAM_Cap_Stop(opCam.hIdxTUCam); // Stop capture TUCamAPI.TUCAM_Buf_Release(opCam.hIdxTUCam); // Release alloc buffer after stop capture and quit drawing thread } } public void StartWaitForFrame(TUCAM_OPEN opCam) { if (m_isWaiting) { return; } if (m_currentCamera.IsOpen()) { m_isWaiting = true; m_waitingThread = new Thread(new ThreadStart(WaitForFrameThreadEntity)); m_frame.pBuffer = IntPtr.Zero; m_frame.ucFormatGet = (byte)TUFRM_FORMATS.TUFRM_FMT_USUAl; m_frame.uiRsdSize = 1; TUCamAPI.TUCAM_Buf_Alloc(opCam.hIdxTUCam, ref m_frame); // Alloc buffer after set resolution or set ROI attribute TUCamAPI.TUCAM_Cap_Start(opCam.hIdxTUCam, (uint)m_triggerAttr.nTgrMode); // Start capture m_waitingThread.Start(); } } /// /// 获取图像帧 /// public void WaitForFrameThreadEntity() { IntPtr hIdxTUCam = this.m_handler.hIdxTUCam; while (m_isWaiting) { m_frame.ucFormatGet = (byte)TUFRM_FORMATS.TUFRM_FMT_USUAl; if (TUCAMRET.TUCAMRET_SUCCESS == TUCamAPI.TUCAM_Buf_WaitForFrame(hIdxTUCam, ref m_frame)) { if (IntPtr.Zero != m_frame.pBuffer) { int nSize = (int)(m_frame.uiImgSize + m_frame.usHeader); if(pBuf==null) pBuf = new byte[nSize]; Marshal.Copy(m_frame.pBuffer, pBuf, 0, nSize); Buffer.BlockCopy(pBuf, (int)(m_frame.usHeader), pBuf, 0, (int)(m_frame.uiImgSize)); if(cameraPreviewDialog!=null && !cameraPreviewDialog.IsDisposed) { this.cameraPreviewDialog.Invoke((EventHandler)(delegate { setValueDel(pBuf, lockObj); })); } /* if (cameraSettingDialog != null && !cameraSettingDialog.IsDisposed) { this.cameraSettingDialog.Invoke((EventHandler)(delegate { setValueDel(pBuf, lockObj); })); }*/ } } } } public void ManualRelease() { if (pBuf != null) { pBuf = null; } if (m_waitingThread != null) { if (m_waitingThread.ThreadState == ThreadState.Stopped) { m_waitingThread = null; } } this.Dispose(); this.Close(); GC.Collect(); } /// /// 判断颜色灰度值 如果是true 则设置为灰色 /// /// public void SetColorModel(bool isGray) { if (m_currentCamera.IsOpen()) { TUCamAPI.TUCAM_Capa_SetValue(this.m_handler.hIdxTUCam, (int)TUCAM_IDCAPA.TUIDC_MONOCHROME, isGray ? 1 : 0); } } } }