⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 okmfcview.cpp

📁 OK视频采集卡VC源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void COkMfcView::OnDispfrombuffer() 
{
	//序列回显
	long num;

	exEnableItem(IDM_FREEZE, TRUE);
	okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
	num = okGetBufferSize(hBoard, NULL, NULL);//			
	okPlaybackFrom(hBoard, BUFFER, 0, num);//
}

void COkMfcView::OnLoopfrombuffer() 
{
	//循环序列回显
	long num;

	exEnableItem(IDM_FREEZE, TRUE);
	okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
	num = okGetBufferSize(hBoard, NULL, NULL);//			
	okPlaybackFrom(hBoard, BUFFER, 0, num);//
}

void COkMfcView::OnDispfrommemory() 
{
	//循环序列回显内存
	long num;

	exEnableItem(IDM_FREEZE, TRUE);
	okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
	if (lpbi) {
		num = dwMaxMemSize/exGetFrameSize(hBoard);
		okPlaybackByBuffer(hBoard, (TARGET)lpMemory, 0, -num);
	}
}

void COkMfcView::OnDispfromfile() 
{
	//循环序列回显文件
	CSeqNum	csf;
	char	szFileName[128]="\0";
	long num;

	if (!exGetLoadName(hWnd, szFileName))
		return;
	exEnableItem(IDM_FREEZE, TRUE);
	okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
	if (!stricmp(strrchr(szFileName, '.'), ".seq")) 
		//just get num
		num = okLoadImageFile(hBoard, szFileName, 0, SCREEN, 0, 0);
	else {
		if (!csf.DoModal())
			exEnableItem(IDM_FREEZE, FALSE);
		num = iNumImage;
	}
	okPlaybackByBuffer(hBoard, (TARGET)szFileName, 0, -num);
}

void COkMfcView::OnCaptomonitor() 
{
	//显示视频输入
	exEnableItem(IDM_FREEZE, TRUE);
	okCaptureTo(hBoard, MONITOR, 0, 0);//0: cont.
}

void COkMfcView::OnDispfromframe() 
{
	//连续回显帧存
	exEnableItem(IDM_FREEZE, TRUE);
	okPlaybackFrom(hBoard, FRAME, 0, 0); //cont.
}

void COkMfcView::OnNormallut() 
{
	//正向输出
	exFillOutLUT(hBoard, 0);
}

void COkMfcView::OnInverselut() 
{
	//反向输出
	exFillOutLUT(hBoard, 1);
}


void COkMfcView::OnAbsolutelut() 
{
	//绝对值输出显示
	exFillOutLUT(hBoard, 2);
}

void COkMfcView::OnSelectcard() 
{
	//选择图像卡
	CSelectBox	selectBox;
	HANDLE	hOld;
	int i;

	hOld=hBoard;

	i = selectBox.DoModal();
	if (i != 1)
		return;

	okSetConvertParam(hBoard,CONVERT_UPRIGHT,0); //un
	okSetConvertParam(hBoard,CONVERT_MIRROR,0);
	okSetCaptureParam(hBoard,CAPTURE_MISCCONTROL,0);
	okCloseBoard(hOld);
	hBoard = exOpenCard(hWnd);

	bActive = 0;
}

void COkMfcView::OnUpdateCaptoframe(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_CapToFrame);
}

void COkMfcView::OnUpdateBuffertoframe(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_BufferToFrame);
}

void COkMfcView::OnUpdateFrametobuffer(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_FrameToBuffer);	
}

void COkMfcView::OnUpdateFrametoscreen(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_FrameToScreen);
}

void COkMfcView::OnUpdateNormallut(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_NormalLut);
}

void COkMfcView::OnUpdateInverselut(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_InverseLut);	
}

void COkMfcView::OnLoadfile() 
{
	//装入图像文件
	okStopCapture(hBoard);
	if (bActive){
		SendMessage(WM_COMMAND, IDM_FREEZE, 0);
	}
	exLoadImageFile(hBoard, hWnd);
	lScrnOffset=exSetToWndRectEx(hBoard, hWnd, m_Centerscreen);
	InvalidateRect(NULL, TRUE);

	exDisplayDIBInfo();
}

void COkMfcView::OnSavescreen() 
{
	exSaveScreenFile(hBoard, hWnd);
	InvalidateRect(NULL, FALSE);
}

void COkMfcView::OnSavebuffer() 
{
	//保存缓存
	exSaveBufferFile(hBoard, hWnd);
	InvalidateRect(NULL, FALSE);
}

void COkMfcView::OnSettoband() 
{
	//置条状色带
	//set gray and color bands to dib and buffer 0
	LPBYTE	lpLinear;
	short	height;
	long	stride;
	//						
	lpLinear = (LPBYTE)okGetTargetInfo(hBoard, BUFFER, 0, NULL, &height, &stride);
	if (lpLinear) {
		exSetTestBands(lpLinear, height, stride); //buffer
		exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
	}
	else {//only dib
		exSetTestBands((LPBYTE)lpdib, (short)lpbi->biHeight, lpbi->biSizeImage/lpbi->biHeight); 
	}
	InvalidateRect(NULL, FALSE);
}

/*
* 函数介绍:获得装入文件名
* 输入参数:hWnd窗口句柄
* 输出参数:szFileName文件名
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exGetLoadName(HWND hWnd, char *szFileName)
{
	OPENFILENAME ofn;	 
	char		*szFilter=
					"BMP file  (*.BMP)\0*.BMP\0"
					"Jpeg format file (*.JPG,JPEG)\0*.JPG;*.JPEG\0"
					"Sequence file  (*.SEQ)\0*.SEQ\0"
					"Audio-video interleaved (*.AVI)\0*.AVI\0"
					"Mpeg2 Video stream (*.M2V)\0*.M2V\0"
					"TIFF file  (*.TIF)\0*.TIF\0"
					"GIF file  (*.GIF)\0*.GIF\0"
					"Raw format files (*.RAW)\0*.RAW\0"
					"All Above format files \0*.BMP;*.JPG;*.JPEG;*.SEQ;*.AVI;*.M2V;*.TIF;*.GIF;*.RAW\0";

    //Get file name
	// fill in non-variant fields of OPENszFileName struct. 
    ZeroMemory(&ofn,sizeof(OPENFILENAME));
	ofn.lStructSize		= sizeof(OPENFILENAME);
    ofn.hwndOwner	  	= hWnd;
    ofn.lpstrFilter 	= szFilter;
	ofn.nFilterIndex	= 8;
    ofn.lpstrFile	  	= szFileName;
    ofn.nMaxFile	  	= 128;
    ofn.Flags		  	= OFN_HIDEREADONLY;

    if (!GetOpenFileName((LPOPENFILENAME)&ofn)) {
		return FALSE;
	}
	return TRUE;

}

/*
* 函数介绍:获得保存文件名
* 输入参数:hWnd窗口句柄
* 输出参数:szFileName文件名
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exGetSaveName(HWND hWnd, char *szFileName)
{
	OPENFILENAME ofn;	 
	char		*szFilter=
					"BMP file (*.BMP)\0*.BMP\0"
					"Jpeg format file (*.JPG)\0*.JPG\0"
					"Sequence file (*.SEQ)\0*.SEQ\0"
					"Sequence file in JPEG (*.SEQ)\0*.SEQ\0"
					"Audio-video interleaved (*.AVI)\0*.AVI\0"
					"Compressed AVI in MJPEG  (*.AVI)\0*.AVI\0"
					"Compressed AVI in MPEG4  (*.AVI)\0*.AVI\0"
					"Raw format files (*.RAW)\0*.RAW\0";

    //Get file name
	// fill in non-variant fields of OPENszFileName struct. 
    ZeroMemory(&ofn,sizeof(OPENFILENAME));
    ofn.lStructSize		= sizeof(OPENFILENAME);
    ofn.hwndOwner	  	= hWnd;
    ofn.lpstrFilter 	= szFilter;
	ofn.nFilterIndex	= 1;
    ofn.lpstrFile	  	= szFileName;
    ofn.nMaxFile	  	= 128;
	ofn.lpstrDefExt		= "seq";

    ofn.Flags		  	= OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;

    if (!GetSaveFileName((LPOPENFILENAME)&ofn)) {
		return FALSE;
	}

	if( !strnicmp(strrchr(szFileName,'.'),".seq",4) ||
			!strnicmp(strrchr(szFileName,'.'),".avi",4) ||
				!strnicmp(strrchr(szFileName,'.'),".m2v",4) 
		)  {
		//first delete ok.seq or .avi
		DeleteFile(szFileName);							
	}

	if(ofn.nFilterIndex==4) { //seq file in jpeg data
		strcat(szFileName,",jpg,50"); //quality=50
	}
	else if(ofn.nFilterIndex==6) { //avi in mjpg
		strcat(szFileName,",mjpg,60"); //mjpeg
	}
	else if(ofn.nFilterIndex==7) { //avi in mpeg4
		strcat(szFileName,",mpg4"); //mpeg4
	}

	return TRUE;
}

/*
* 函数介绍:装入图像文件
* 输入参数:hBoard采集卡句柄
*			hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exLoadImageFile(HANDLE hBoard, HWND hWnd)
{
	char		szFileName[128]="\0";
	short		total;
	long		length;
	BLOCKINFO	blkinfo;

	if (!exGetLoadName(hWnd, szFileName))
		return FALSE;

	if (!strrchr(szFileName, '.'))
		return FALSE;

	if(!stricmp(strrchr(szFileName,'.'), ".seq") ||
			!stricmp(strrchr(szFileName,'.'), ".avi"))
	{ 		
		//first get inf about seq file 		
		total = (short)okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 0);//no=0
		//then load them into buffer
		if (okLoadImageFile(hBoard, szFileName, 0, BUFFER, 0, total)) 
		{
			//last set first block to dib

			exGetBitmapHeader(hBoard, BUFFER, lpbi); 
			exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
		}
	}
	else 
	{ //if( !stricmp(strrchr(szFileName,'.'),".bmp") ){//bmp
		//load bmp or raw into buffer and dib 	
		if (okGetBufferSize(hBoard, NULL, (DWORD *)&dwBufSize))  //buffer being
		{
			long	lParam1=0, lNum=1;
			CSeqNum	csf;
	
			iNumImage = (short)lNum;
			if (csf.DoModal()) 
			{
				lNum = iNumImage;
			}

			//then load them into buffer
			if (length = okLoadImageFile(hBoard, szFileName, lParam1, BUFFER, 0, lNum)) 
			{

				if (exAllocateDIBMemory(0) < length) 
				{
					if (!exAllocateDIBMemory(length + 5120))
						return 0;
				}

				//last set first block to dib
				exGetBitmapHeader(hBoard, BUFFER, lpbi); 
				exSetDataToDIB(BUFFER, 0, lpbi, (BYTE *)lpdib);
			}
		}
		else 
		{
			//way 2
			//just load to dib (& screen)
			memset(&blkinfo, 0, sizeof(blkinfo)); //zero all for init

			blkinfo.lpBits = NULL; //only get block info
			okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);
			//get dib for wnd paint
			blkinfo.lpBits = (LPBYTE)lpdib;
			blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize);  //do here
			if (okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1))
			{
				// set dib info
				
				exGetBitmapHeader(hBoard, (TARGET)&blkinfo, lpbi);
				exConvertBitmap(lpbi, lpdib); //invert y
			}
		}
	}

	return TRUE;
}

/*
* 函数介绍:保存屏幕图像文件 目前支持bmp,jpg,raw格式
* 输入参数:hBoard采集卡句柄
*			hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exSaveScreenFile(HANDLE hBoard, HWND hWnd)
{
	char		szFileName[128]="\0";
	BLOCKINFO	blkinfo;

	if (!exGetSaveName(hWnd, szFileName))
		return FALSE;

	if (!strrchr(szFileName, '.'))
		return FALSE;

	//save current dib
	blkinfo.iWidth = (short)lpbi->biWidth;
	blkinfo.iHeight = (short)lpbi->biHeight;
	blkinfo.iBitCount = (short)lpbi->biBitCount;
	blkinfo.lpBits = (LPBYTE)lpdib;
	blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize);

	blkinfo.iFormType = 0; //unknown
	//special for 565
	if (lpbi->biBitCount == 16)
	{
		DWORD	*lpMask=(DWORD *)blkinfo.lpExtra;

		if (lpMask[1] == 0x07e0) //565
			blkinfo.iFormType = FORM_RGB565;
		else
			blkinfo.iFormType = FORM_RGB555;
	}

	//first inverse dib to bitmap
	exConvertBitmap(lpbi, lpdib);
	okSaveImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);	
	//restore to dib
	exConvertBitmap(lpbi, lpdib);
	return TRUE;
}

/*
* 函数介绍:保存缓存图像文件 目前支持bmp,jpg,raw,seq格式
* 输入参数:hBoard采集卡句柄
*			hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exSaveBufferFile(HANDLE hBoard, HWND hWnd)
{
	char		szFileName[128]="\0";
	BLOCKINFO	blkinfo;
	CSeqNum	csf;

	ZeroMemory(&blkinfo,sizeof(BLOCKINFO));

	if (!exGetSaveName(hWnd, szFileName))	return FALSE;

	if (!strrchr(szFileName, '.'))	return FALSE;

	if(!strnicmp(strrchr(szFileName,'.'), ".seq", 4) ||
			!strnicmp(strrchr(szFileName,'.'), ".avi", 4) ||
				!strnicmp(strrchr(szFileName,'.'), ".m2v", 4)) 
	{
		//save buffer seq
		total = (short)okGetBufferSize(hBoard, NULL, NULL);
		okSaveImageFile(hBoard, szFileName, 0, BUFFER, 0, total);	

		//than set this first block to dib to see what we saved
		exGetBitmapHeader(hBoard, BUFFER, lpbi); 
		exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
	}
	else  //bmp or bmp
	{
		if (okGetBufferSize(hBoard, NULL, (DWORD*)&dwBufSize))  //buffer being
		{
			long	lNum = 1;

			//how many
			if (!csf.DoModal()) 
				return FALSE;
			lNum = iNumImage;

			okSaveImageFile(hBoard,szFileName,1,BUFFER,0,lNum);	

			//than set this first block to dib to see what we saved
			exGetBitmapHeader(hBoard, BUFFER, lpbi); 
			exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
		}
		else  //no buffer allocated
		{
			//save current dib
			blkinfo.iWidth = (short)lpbi->biWidth;
			blkinfo.iHeight = (short)lpbi->biHeight;

			blkinfo.lBlockStep=0;
			blkinfo.iHiStep=0;

			blkinfo.iBitCount = (short)lpbi->biBitCount;
			blkinfo.lpBits = (LPBYTE)lpdib;
			blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize);

			blkinfo.iFormType = 0; //unknown
			//special for 565
			if (lpbi->biBitCount == 16) 
			{
				DWORD	*lpMask=(DWORD *)blkinfo.lpExtra;

				if (lpMask[1] == 0x07e0) //565
					blkinfo.iFormType = FORM_RGB565;
				else
					blkinfo.iFormType = FORM_RGB555;
			}

			//first inverse dib to bitmap
			exConvertBitmap(lpbi, lpdib);
			okSaveImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);	
			//restore to dib
			exConvertBitmap(lpbi, lpdib);
		}
	}
	return TRUE;
}

/*
* 函数介绍:演示如何填写输出查找表
* 输入参数:hBoard采集卡句柄
*			index输出状态 0-正常 1-反向 2绝对值 3绝对值DSA显示
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exFillOutLUT(HANDLE hBoard, short index)
{
	short	i,bits,start=0;


	//check how much bits LUT suppored
	bits=(short)okFillOutLUT(hBoard, NULL, 0, 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -