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

📄 recimage.cpp

📁 超声影像工作站系统可与各种型号的B超、彩超连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		else { //frozen status
			width=(short)lpbi->biWidth;
			height=(short)lpbi->biHeight;
		}
		if( (rect.right) > width )
			rect.left=( (rect.right - width )/2 ) ;//& (~0x3);
		if( (rect.bottom) > height )
			rect.top=( (rect.bottom - height )/2);
	}

	//make offset x,y
	lSize=MAKELONG(rect.left,rect.top);
	rect.right=rect.left+min(sampwidth,rect.right);
	rect.bottom=rect.top+min(sampheight,rect.bottom);

	//map to absolute screen rect
	MapWindowPoints(hWnd,HWND_DESKTOP,(LPPOINT)&rect,2);

	okSetTargetRect(hBoard, SCREEN, &rect);

	return lSize;

}

//set bitmap header and bitmap info if need
long SetBitmapHeader(LPBITMAPINFOHEADER lpbi,short width,short height, short bits, short form)
{
	long	wbytes;

	if(!lpbi)
		return FALSE;

	lpbi->biWidth=width;
	lpbi->biHeight=height;

	lpbi->biSize=sizeof(BITMAPINFOHEADER);
	lpbi->biPlanes=1;

	lpbi->biBitCount=bits;
	wbytes=((((lpbi->biWidth*bits)+31)&~31)>>3);//bmp need 4 byte align
	lpbi->biSizeImage=wbytes*lpbi->biHeight;

	lpbi->biClrUsed=0;
	//special format for 555,565 & 32 
	if(form==FORM_RGB555 || form==FORM_RGB565 || form==FORM_RGB8888 ) 
		lpbi->biCompression=BI_BITFIELDS;
	else
		lpbi->biCompression=0;
	if(lpbi->biCompression==BI_BITFIELDS) {//
		DWORD	*lpmask;
		lpmask=(DWORD *)((LPSTR)lpbi+lpbi->biSize);

		if(form==FORM_RGB555) {
			lpmask[2]=0x001f; //blue
			lpmask[1]=0x03e0;
			lpmask[0]=0x7c00;
		}
		else if(form==FORM_RGB565) {
			lpmask[2]=0x001f; //blue
			lpmask[1]=0x07e0;
			lpmask[0]=0xf800;
		}
		else if(bits==32) {
			lpmask[2]=0x0000ff;
			lpmask[1]=0x00ff00;
			lpmask[0]=0xff0000;
		}
	}
	else if(bits<=12) { // 8,10,12
		int		i;
		RGBQUAD	*lpRGB=(RGBQUAD *)((LPSTR)lpbi+lpbi->biSize);

		lpbi->biClrUsed=(1<<bits);
		for(i=0; i<(short)lpbi->biClrUsed;i++) {
			lpRGB[i].rgbBlue=i;
			lpRGB[i].rgbGreen=i;
			lpRGB[i].rgbRed=i;
			lpRGB[i].rgbReserved=0;
		}
	} 
	lpbi->biClrImportant=lpbi->biClrUsed;

	return lpbi->biClrUsed;
}

//get size 
long GetTargetSize(HANDLE hBoard, TARGET tgt, short *width, short *height)
{
	RECT	rect;
	long	form;


	if( (tgt==SCREEN ) ||(tgt==BUFFER) ) {
		rect.right=-1;
		okSetTargetRect(hBoard,tgt,&rect); //get current rect
		*width=(short)(rect.right-rect.left);
		*height=(short)(rect.bottom-rect.top);

		if(tgt==SCREEN ) {
			form=okSetCaptureParam(hBoard,3,GETCURRPARAM); //-1
			//limit to video rect
			rect.right=-1; //max. captured rect
			okSetTargetRect(hBoard,VIDEO,&rect); //get video rect
			*width=(short)min(*width,rect.right-rect.left);
			*height=(short)min(*height,rect.bottom-rect.top);
		}
		else if(tgt==BUFFER) 
			form=okSetCaptureParam(hBoard,4,GETCURRPARAM); //-1

	} else if(tgt>BUFFER) { //from blkinfo
		LPBLOCKINFO	lpblk;
		lpblk=(LPBLOCKINFO)tgt;

		*width=lpblk->iWidth;
		*height=abs(lpblk->iHeight);
		form=MAKELONG(lpblk->iFormType,lpblk->iBitCount);
	}


	return form;
}

BOOL
SaveScreenFile(HANDLE hBoard, HWND hWnd)
{
	OFSTRUCT	OfStruct;    
	HFILE		hFile;
	OPENFILENAME ofn;	 
	char		szFileName[128]="\0";
	char		*szFilter=
					"BMP file (*.BMP)\0*.BMP\0"
					"Jpeg format file (*.JPG)\0*.JPG\0"
					"Raw format files (*.RAW)\0*.RAW\0";
	BLOCKINFO	blkinfo;

    //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		= "bmp";

    ofn.Flags		  	= OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;

    if (!GetSaveFileName ((LPOPENFILENAME)&ofn)) {
		return FALSE;
	}
	
	//Create file
    if	(HFILE_ERROR == (hFile = OpenFile(szFileName, &OfStruct, OF_PROMPT | OF_CANCEL | OF_CREATE)))
        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		= (unsigned char *)lpdib;
	blkinfo.lpExtra		= (unsigned char *)lpbi + lpbi->biSize;

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

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

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

	return	(TRUE);
}

//save image in buffer as file (support bmp, raw, seq)
bool SaveBufferFile(HANDLE hBoard, HWND hWnd, char *filename)
{
	OFSTRUCT	OfStruct;
	HFILE		hFile;
	
	//Create file
    if	(HFILE_ERROR == (hFile = OpenFile(filename, &OfStruct, OF_PROMPT | OF_CANCEL | OF_CREATE)))
	{
        return	(FALSE);
    }

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

	if	(!stricmp(strrchr(filename, '.'), ".seq"))
	{
		//save buffer seq
		total	= (short)okGetBufferSize(hBoard, NULL, NULL);
		okSaveImageFile(hBoard, filename, 0, BUFFER, 0, total);

		//than set this first block to dib to see what we saved
		GetBitmapHeader(hBoard, BUFFER, lpbi); 
		SetDataToDIB(BUFFER, 0, lpbi, (unsigned char*)lpdib);
	}
	else
	{ //bmp or bmp
		if( okGetBufferSize(hBoard,NULL,(unsigned long*)&dwBufSize) ) { //buffer being
			okSaveImageFile(hBoard,filename,0,BUFFER,0,1);	

			//than set this first block to dib to see what we saved
			GetBitmapHeader(hBoard, BUFFER, lpbi); 
			SetDataToDIB(BUFFER, 0, lpbi, (unsigned char*)lpdib);
		}
		else { //no buffer allocated
			//save current dib
			blkinfo.iWidth=(short)lpbi->biWidth;
			blkinfo.iHeight=(short)lpbi->biHeight;
			blkinfo.iBitCount=(short)lpbi->biBitCount;
			blkinfo.lpBits=(unsigned char*)lpdib;
			blkinfo.lpExtra=(unsigned char*)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
			ConvertBitmap(lpbi,lpdib);
			okSaveImageFile(hBoard,filename
				,0,(TARGET)&blkinfo,0,1);	
			//restore to dib
			ConvertBitmap(lpbi,lpdib);
		}
	}
	return	(TRUE);
}

BOOL ConvertBitmap(LPBITMAPINFOHEADER lpbi,LPSTR lpdib)
{
	long	i,wbytes;
	LPSTR	lpbuf;
	LPSTR	lptop,lpbottom;

	if(!lpbi)
		return FALSE;
	if(!lpbi->biHeight)
		return FALSE;

	//inverse dib (top to bottom)
	wbytes=lpbi->biSizeImage/lpbi->biHeight;
	lpbuf=(LPSTR)GlobalAlloc(GPTR,wbytes);

	lptop=lpdib;
	lpbottom=lpdib+(lpbi->biHeight-1)*wbytes;
	for(i=0;i<lpbi->biHeight/2;i++) {
		CopyMemory(lpbuf,lptop,wbytes);
		CopyMemory(lptop,lpbottom,wbytes);
		CopyMemory(lpbottom,lpbuf,wbytes);
		lptop+=wbytes;
		lpbottom-=wbytes;
	}
	return TRUE;
}


BOOL CALLBACK
BeginCapture(HANDLE hBoard)
{
//zlj
	short		width, height;
	long		blkform;
	blkform		= sizeof(blk);

	if	(bDispToScreen)
	{
		bufform	= GetTargetSize(hBoard, BUFFER, &width, &height);
		if	((LOWORD(bufform) == FORM_GRAY10) || (LOWORD(bufform) == FORM_GRAY12))
		{
			blkform		= MAKELONG(FORM_GRAY8, 8);
		}
		else
		{
			//take same bits as buffer
			blkform		= bufform;
		}
		SetBitmapHeader(lpbi, width, height, HIWORD(blkform), LOWORD(blkform));
	}

	blk.lpBits		= (unsigned char *)(lpdib);
	blk.iBitCount	= lpbi->biBitCount;
	blk.iWidth		= (short)(lpbi->biWidth);


	int a=okSetCaptureParam(hBoard, 4, FORM_RGB888);

 
	if	(0 == okSetCaptureParam(hBoard, 10, 1)) 
		if	(1 == LOWORD(okSetVideoParam(hBoard, 8,0 ))) //zlj -1 //interlace video
			if	(0 != okSetConvertParam(hBoard, 1, -1))
				lpbi->biHeight	*= 2; //double size for ht

	blk.iHeight	= -(short)(lpbi->biHeight); //note: minus is for invert dib in y by ConvertRect	

	elapsed		= GetTickCount();
	numframe_BackDisplay	= 0;

	return	(TRUE);
}

BOOL CALLBACK BackDisplay(HANDLE hBoard,long no)
{		
	//return 1;

	numframe_BackDisplay++;
	Sleep(PlayBackDelay);
	//sprintf(string,"captured frames = %d ",no);
	//sprintf(string,"Total frames = %d; Current = %d ",numframe_BackDisplay, no);
	//SetWindowText(hwnd,string);
	//AfxMessageBox("dd");
	if(bDispToScreen) {
		if( (LOWORD(bufform)==FORM_GRAY10) ||(LOWORD(bufform)==FORM_GRAY12) ) { //special  
			//way 1
			//okConvertRect(hBoard,(TARGET)&blk,0,BUFFER,(short)no,1);
			okConvertRect(hBoard,SCREEN,0,BUFFER,(short)no,1);
			//way 2
			//okReadRectEx(hBoard,BUFFER,(short)no,lpdib, MAKELONG(FORM_GRAY8,1)); 
														 //read only red data
		}
		else {
			//Sleep(5);
			//way 1
			//okTransferRect(hBoard,(TARGET)&blk,0,BUFFER,(short)no,1);
			//okTransferRect(hBoard,SCREEN,0,BUFFER,(short)no,1);
			okConvertRect(hBoard,SCREEN,0,BUFFER,(short)no,1);
			//way 2
			//okReadRect(hBoard,BUFFER,(short)no,lpdib);
		}
		//InvalidateRect(hwnd,NULL,FALSE);
	}

	return 1;
}

BOOL CALLBACK EndCapture(HANDLE hBoard)
{
	//clear callback
	okSetSeqCallback(hBoard, NULL, NULL, NULL);
	//int a=ReleaseSemaphore(hSemaphore,1,0);
	elapsed		= GetTickCount() - elapsed;
	return	(TRUE);

}

BOOL CALLBACK OnCapSeq(HANDLE hBoard, long no)
{
	char	fn[400];
	short	w, h;
	long	s;
	int		 i, j ,k;
	char	*buf,*bufTemp;
	buf= ( char*)okGetTargetInfo(hBoard,BUFFER , 0, &w, &h, &s);
	if(RecImage::bForwordCap){	
		//capture data to the forward  buffer	
		if(fdBuf.tail>= NUM_FD_BUF-1){
			bufTemp=fdBuf.bufArry[0];
			for(i=0;i<=NUM_FD_BUF-2;i++)
				fdBuf.bufArry[i]=fdBuf.bufArry[i+1];
			fdBuf.bufArry[NUM_FD_BUF-1]=bufTemp;
			fdBuf.tail=NUM_FD_BUF-1;
		}
		for	(i = 0; i <H_PAL; i++)		
			memcpy(fdBuf.bufArry[fdBuf.tail] + i*W_PAL*3 , buf+(H_PAL-i)*W_PAL*3 , W_PAL*3);
		fdBuf.tail++;
	}
	if(RecImage::bBackCap){
		//capture data to the back  buffer
		if	(++nBackFrame >totalNumFrame ){
			RecImage::bBackCap=0;
		}
		for	(i = 0; i <H_PAL; i++)		
			memcpy( (char*)(lpBackCapBuf+ i*W_PAL*3)  , (char*)(buf+(H_PAL-i)*W_PAL*3) , W_PAL*3);
		lpBackCapBuf+=PALBytesFrame;
	}
	return	TRUE;
}


long
GetFrameSize(HANDLE hBoard)
{
	long	bits, size;

	size	= okSetCaptureParam(hBoard, 6, -1);
	bits	= okSetCaptureParam(hBoard, 4, -1);
	size	= HIWORD(bits) / 8 * LOWORD(size) * HIWORD(size);

	return	(size);
}

	

void RecImage::SaveDataToDisk()
{
	//AfxBeginThread(SaveDataToDisk ,0);
	short	w, h;
	long	s;
	char	fn[400];
	int		 i, j ,k;
	lpBackCapBuf=lpBackBufTemp;


    en_para.hWakeEncode=CreateSemaphore(0,0,1,0);
	en_para.hUpdata=CreateSemaphore(0,1,1,0);
	en_para.hFinish=CreateSemaphore(0,0,1,0);
	en_para.height= H_PAL;
	en_para.width=W_PAL;
	strcpy(en_para.out_name,"D:\\data\\out1.m2v");
	en_para.nframes=totalNumFrame;	
	en_para.nMpeg=0;

	okGetTargetInfo(hpcih, BUFFER, 0, &w, &h, &s);
	if(	!bBackCap){	//BackCap is end
		
		CreateThread(0,0,EncodeMpeg,(LPVOID)&en_para,0,0);
		for(k=0;k<totalNumFrame;k++){//	
			AddFrame(0,(unsigned char *)lpBackCapBuf);	
			lpBackCapBuf+=PALBytesFrame;
		}
		WaitForSingleObject(en_para.hFinish,INFINITE);
		CloseHandle(en_para.hFinish);
		lpBackCapBuf=lpBackBufTemp;
	}/**/
		
	en_para.hWakeEncode=CreateSemaphore(0,0,1,0);
	en_para.hUpdata=CreateSemaphore(0,1,1,0);
	en_para.hFinish=CreateSemaphore(0,0,1,0);
	en_para.height= H_PAL;
	en_para.width=W_PAL;
	en_para.nframes=NUM_FD_BUF;	
	en_para.nMpeg=0;
	strcpy(en_para.out_name,"D:\\data\\out2.m2v");
	CreateThread(0,0,EncodeMpeg,(LPVOID)&en_para,0,0);
	for(k=0;k<NUM_FD_BUF;k++)
		AddFrame(0,(unsigned char *)fdBuf.bufArry[k] );	
	WaitForSingleObject(en_para.hFinish,INFINITE);
	CloseHandle(en_para.hFinish);

}
/*
void RecImage::SaveDataToDisk()
{
	//AfxBeginThread(SaveDataToDisk ,0);
	short	w, h;
	long	s;
	char	fn[400];
	int		 i, j ,k;

	okGetTargetInfo(hpcih, BUFFER, 0, &w, &h, &s);
	int		rr;
	BITMAPINFOHEADER			bmiHeader;
	bmiHeader.biSize			= sizeof(BITMAPINFOHEADER);
	bmiHeader.biWidth			= w;
	bmiHeader.biHeight			= h;
	bmiHeader.biPlanes			= 1;
	bmiHeader.biBitCount		= 24;
	bmiHeader.biCompression		= BI_RGB;
	bmiHeader.biSizeImage		= 0;
	bmiHeader.biXPelsPerMeter	= 0;
	bmiHeader.biYPelsPerMeter	= 0;
	bmiHeader.biClrUsed			= 0;
	bmiHeader.biClrImportant	= 0;
			

	if(	!bBackCap){	//BackCap is end
		CAVITools				avi;
		sprintf(::SeqFilePath, "%s\\%s%d.avi", ((CBxtDlg *)AfxGetMainWnd())->m_workingpath,"BackCap",nAviFile);
		rr = avi.SetStreamFormatFromMemory(&bmiHeader, FALSE);
		rr = avi.CreateAviFile(::SeqFilePath, 25);

		lpBackCapBuf=lpBackBufTemp;
		for(k=0;k<totalNumFrame;k++){//
			CPic	pp;
			sprintf(fn, "%sxx%d.jpg", SeqFilePath, k);
			pp.m_width	= W_PAL;
			pp.m_height	= H_PAL;
			pp.m_buf	= new BYTE[PALBytesFrame];

			memcpy( pp.m_buf ,lpBackCapBuf ,PALBytesFrame );
			lpBackCapBuf+=PALBytesFrame;
			pp.m_filename	= _T(fn);
			pp.fileType		= 1;
			pp.flag			= 1;//Color;
			avi.AddMemFrame((CHAR *)(pp.m_buf));
			pp.Close();
		}
		lpBackCapBuf=lpBackBufTemp;
		avi.CleanUp();
	}
	//if(	bForwordCap){  //the forword buffer  always contain data;
	CAVITools				avi;
	sprintf(::SeqFilePath, "%s\\%s%d.avi", ((CBxtDlg *)AfxGetMainWnd())->m_workingpath,"ForwordCap",nAviFile);	
	rr = avi.SetStreamFormatFromMemory(&bmiHeader, FALSE);
	rr = avi.CreateAviFile(::SeqFilePath, 25);

	for(k=0;k<NUM_FD_BUF;k++){//
		CPic	pp;
		sprintf(fn, "%sxx%d.jpg", SeqFilePath, k);
		pp.m_width	= W_PAL;
		pp.m_height	= H_PAL;
		pp.m_buf	= new BYTE[PALBytesFrame];
		memcpy( pp.m_buf ,fdBuf.bufArry[k] ,PALBytesFrame );

		pp.m_filename	= _T(fn);
		pp.fileType		= 1;
		pp.flag			= 1;//Color;
		avi.AddMemFrame((CHAR *)(pp.m_buf));
		pp.Close();
	}
	lpBackCapBuf=lpBackBufTemp;
	avi.CleanUp();
	//}

	nAviFile++;
}
*/
#include "bxtDlg.h"
UINT
SaveDataToDisk(LPVOID lParam)
{
	
	return 0;
}

void RecImage::PostNcDestroy() 
{
	// TODO: Add your specialized code here and/or call the base class
	if(lpBackCapBuf)
		delete lpBackCapBuf;
	CDialog::PostNcDestroy();
}


⌨️ 快捷键说明

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