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

📄 recimage.cpp

📁 CT工作站具有打印报告、病历管理、图像处理专家词库等功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// RecImage.cpp : implementation file
//

#include "stdafx.h"
#include "bxt.h"
#include "RecImage.h"
//#include "memalloc.h"
#include "pic.h"
#include "bxtdlg.h"
#include "bmpfile.h"
#include "registry.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define BMP_HEADERSIZE (3 * 2 + 4 * 12)

#define		NUMINFILE		30
//----global variables for board--------
HANDLE		hBoard;
BYTE		bActive=0;
short		total=2;
long		iCurrUsedNo=-1;//	

short		iNumImage=NUMINFILE;

short		bScrnCenter=1; //centerize
long		lScrnOffset;
short		sampwidth,sampheight;

short		bMaskMode=0; // mask disable

LPSTR		seqfile="ok.seq";
DWORD		dwMaxMemSize=30*1024*1024;
long		dwBufSize;
int			PlayBackDelay=100;

LPBITMAPINFOHEADER	lpbi=NULL;
LPSTR				lpdib;
LPSTR				lpMemory;
BLOCKINFO			blkinfo;


LPDIBINFO			lpDibPlay;
BOOL				bDispToScreen;

long SetBitmapHeader(LPBITMAPINFOHEADER lpbi,short width,short height, short bits, short form);
long SetDataToDIB(TARGET src, short start, LPBITMAPINFOHEADER lpbi, LPBYTE lpdib);
long GetTargetSize(HANDLE hBoard, TARGET tgt, short *width, short *heigth);

BOOL GetBitmapData(HANDLE hBoard, TARGET tgt, short start, LPBITMAPINFOHEADER lpbi, LPSTR lpdib);
BOOL GetBitmapHeader(HANDLE hBoard, TARGET src, LPBITMAPINFOHEADER lpbi);

long SetToWndRectEx(HANDLE hBoard, HWND hWnd, long lMode);
void DemoMask();


bool SaveBufferFile(HANDLE hBoard, HWND hWnd,char *filename);
BOOL ConvertBitmap(LPBITMAPINFOHEADER lpbi,LPSTR lpdib);

long GetFrameSize(HANDLE hBoard);

BOOL CALLBACK BackDisplay(HANDLE hBoard,long no);
BOOL CALLBACK BeginCapture(HANDLE hBoard);
BOOL CALLBACK EndCapture(HANDLE hBoard);

/////////////////////////////////////////////////////////////////////////////
// RecImage dialog
//static HINSTANCE	hinstDevice;	// handle of Device Drive DLL


RecImage::RecImage(CWnd* pParent /*=NULL*/)
	: CDialog(RecImage::IDD, pParent)
{
	//{{AFX_DATA_INIT(RecImage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

void RecImage::CloseRecImage()
{
	okStopCapture(hpcih);
	okCloseBoard(hpcih);
	//PCIHCapture(hpcih,false);
	//EndPCIH(hpcih);
	//FreeLibrary( hinstDevice );	
}

void RecImage::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(RecImage)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(RecImage, CDialog)
	//{{AFX_MSG_MAP(RecImage)
	ON_WM_TIMER()
	ON_WM_SHOWWINDOW()
	ON_WM_CLOSE()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WX_RECONE,CapturePIcOne)
	ON_MESSAGE(WX_SETDSPMODE,mSetDispMode)
	ON_MESSAGE(WX_RECSETBRI,mSetRecBri)
	ON_MESSAGE(WX_RECSETCON,mSetRecCon)
	ON_MESSAGE(WX_RECSETFRQ,mSetRecFrq)
	ON_MESSAGE(WX_RECSETCLP,mSetRecClp)
	ON_MESSAGE(WX_REPHOTO,RePhotoPic)
	ON_MESSAGE(WX_STOP,RecStop)
	ON_MESSAGE(WX_TEST,RecTest)
	ON_MESSAGE(WX_SETREBRI,SetRephotoBri)
//	ON_MESSAGE(WX_RECSETSRC,mSetRecSrc)
//	ON_MESSAGE(WX_RECSETSTN,mSetRecStn)
//	ON_MESSAGE(WX_RECSETSYN,mSetRecSyn)
//	ON_MESSAGE(WX_PLAYBACK,PlayBackSeq)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// RecImage message handlers

BOOL RecImage::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CRegistry reg;
	if(reg.VerifyKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\xiebaodong\\bxt"))
	{
		reg.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\xiebaodong\\bxt");
		reg.Read("RephotoBri",RephotoBri);
		//CString hid;
		//int did;
		//if (reg.Read("scaner_name",hid)!=0) scaner_name = hid;
		//if (reg.Read("scaner_win_title",hid)!=0) scaner_title = hid;
		//strcpy(scanwintitle,hid.GetBuffer(10));
		reg.Close();
	}
	else
		RephotoBri=500;
	long bb=-1;
	hpcih = okOpenBoard(&bb);
	CRect rr;
	GetClientRect(&rr);
	ClientToScreen(&rr);
	rr.OffsetRect(1,80);
	okSetTargetRect(hpcih,SCREEN,&rr);
	freeze = true;
	CapturedNum = 1 ;//Already Capture pic number
	char	string[100];
	MEMORYSTATUS Status;

	if(!lpbi) { 
		GlobalMemoryStatus(&Status);

		//determaine how many memory will be allocated as user memory
		dwMaxMemSize=Status.dwTotalPhys-dwBufSize-32*(1<<20); //I'd keep 32M for window system
		if(dwMaxMemSize<=0)
			dwMaxMemSize=5*(1<<20); //5M
		else if( dwMaxMemSize>Status.dwAvailPhys )
			dwMaxMemSize=Status.dwAvailPhys/2;

		if( dwMaxMemSize<5*(1<<20) ) //need 5M at least for user memory
			dwMaxMemSize=max(5*(1<<20),Status.dwAvailPhys);


		lpbi=(LPBITMAPINFOHEADER)GlobalAlloc(GPTR,dwMaxMemSize);
		if(lpbi==NULL) {
			dwMaxMemSize=4*(1<<20); //4M
			lpbi=(LPBITMAPINFOHEADER)GlobalAlloc(GPTR,dwMaxMemSize);
		}
		lpdib=(LPSTR)lpbi+5120; //keep 5k for bi
		lpMemory=(LPSTR)lpbi+2048*1024; //keep 2M for dib
		dwMaxMemSize-=2048*1024+5120;

		if(lpbi) {
			sprintf(string,"Allocated memory = %d",dwMaxMemSize);
		}else
			sprintf(string,"Allocate memory failed !");
	//	MessageBox(hwnd,string,"Message",MB_OK);

	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void RecImage::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	return;
	
	CDialog::OnTimer(nIDEvent);
}

BOOL RecImage::DestroyWindow() 
{
	return CDialog::DestroyWindow();
}

void RecImage::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
	if(bShow)
		okCaptureToScreen(hpcih);
	else
		okStopCapture(hpcih);
}

void RecImage::OnClose() 
{
	okStopCapture(hpcih);
	okCloseBoard(hpcih);
	CDialog::OnClose();
}

void RecImage::OnOK()
{
}

void RecImage::OnCancel()
{
}

void RecImage::SetRephotoBri(WPARAM wParm, LPARAM lParm)
{
	RephotoBri = wParm;
}
void RecImage::RecTest(WPARAM wParm, LPARAM lParm)
{
	long mm=okGetSignalParam(hpcih,wParm);
	char mms[20];
	sprintf(mms,"%d",mm);
	AfxMessageBox(mms);
}

void RecImage::RecStop(WPARAM wParm, LPARAM lParm)
{
	okStopCapture(hpcih);
}

void
RecImage::PlayBackSeq(WPARAM wParm, LPARAM lParm)
{
	if(wParm==-1)
	{
		okStopCapture(hpcih);
		((CBxtDlg*)AfxGetMainWnd())->imgpcs->Invalidate(true);
		return;
	}
	if(wParm==-2)
	{
		PlayBackDelay = lParm;
		return;
	}
	okStopCapture(hpcih);
	bDispToScreen=1;
	okSetSeqCallback(hpcih,BeginCapture,BackDisplay,EndCapture);
	char *fn=(char*) lParm;
	long num=okLoadImageFile(hpcih, fn, 0, SCREEN, 0, 0);
	okPlaybackByBuffer(hpcih,(TARGET)fn,0,-num);
}

void RecImage::CaptureOne(char *fn)
{
		okStopCapture(hpcih);
		//
			//okSetCaptureParam(hpcih,4,FORM_GRAY8);
			okSetCaptureParam(hpcih,3,FORM_GRAY10);
			okSetCaptureParam(hpcih,4,FORM_GRAY10);
			okSetCaptureParam(hpcih,5,FORM_GRAY10);
			//okSetCaptureParam(hpcih,4,FORM_GRAY888);
			//okSetCaptureParam(hpcih,4,FORM_RGB888); //for Color RGB100 Card
		//
		okCaptureTo(hpcih,BUFFER,0,1);//single
		/*BLOCKINFO	blk;
		blk.iType=BLKHEADER;
		blk.lpBits=(unsigned char*)lpMemory;
		okCaptureTo(hpcih,(TARGET)lpMemory,0,1);//single
		Sleep(20);
		FILE *fp;
		fp=fopen("c:\\xbbb.raw","wb");
		fwrite(lpMemory,GetFrameSize(hpcih),1,fp);
		fclose(fp);*/
		//BMPFile mm;
		//mm.SaveBMP("c:\\xbb.bmp",(unsigned char*)lpMemory,768,576,12,1024,NULL);
		//okGetCaptureStatus(hpcih,1);
		Sleep(20); //do waiting here
		//buf->scr
		

		//GetBitmapHeader(hpcih, BUFFER, lpbi); 
		short w,h;
		long s;
		unsigned char *buf=(unsigned char*)okGetTargetInfo(hpcih,BUFFER,0,&w,&h,&s);
		//WORD *buf=(WORD*)okGetTargetInfo(hpcih,BUFFER,0,&w,&h,&s);
		//SetBitmapHeader(lpbi,w,h,16,FORM_GRAY10);
		/*FILE *fp;
		fp=fopen("c:\\xbbb.bmp","wb");

		int cmapsize = 0;//1024 * 4;
		int datasize = w*h*2;
		long filesize = BMP_HEADERSIZE + cmapsize + datasize;
		int pixeloffset = BMP_HEADERSIZE + cmapsize;
		char bm[2];
		bm[0]='B';
		bm[1]='M';
		// header stuff
		BITMAPFILEHEADER bmfh;
		bmfh.bfType=*(WORD *)&bm; 
		bmfh.bfSize= filesize; 
		bmfh.bfReserved1=0; 
		bmfh.bfReserved2=0; 
		bmfh.bfOffBits=pixeloffset; 
		fwrite(&bmfh, sizeof (BITMAPFILEHEADER), 1, fp);
		fwrite(lpbi, sizeof (BITMAPINFOHEADER), 1, fp);
		*/
		CPic pp;
		pp.m_width = w;
		pp.m_height = h;
		pp.m_buf =new BYTE[w*h];
		int i,j;
		/*for (i = 0; i< 1024; i++) {
			putc(i, fp);
			putc(i, fp);
			putc(i, fp);
			putc(0, fp);	// dummy
		}*/
		long pix;
		for(i=h-1;i>=0;i--)
			for(j=0;j<w;j++)
			{
				//pix = (buf[i*s+j*2+1]*255+buf[i*s+j*2])/1023*255;
				//pix = buf[i*s+j]/1023*255;
				pix = buf[i*s+j*2+1];pix*=256;pix+=buf[i*s+j*2];
				pix /= 4;
				//pp.m_buf[(h-i-1)*w+j]=buf[i*s+j];
				pp.m_buf[(h-i-1)*w+j]=pix;

				//putc(buf[i*s+j*2],fp);
				//putc(buf[i*s+j*2+1],fp);
			}
		pp.m_filename=_T(fn);
		pp.fileType = 1;
		pp.flag = 0;//gray;

		pp.savejpg(fn);
		pp.Close();
		//fwrite((char*)buf,GetFrameSize(hpcih),1,fp);
		///fclose(fp);

		//SetBitmapHeader(lpbi,758,576,10,FORM_GRAY10);
		///SetDataToDIB(BUFFER, 0, lpbi, (unsigned char*)lpdib);
		//okStopCapture(hBoard);
		///SaveBufferFile(hpcih,m_hWnd,fn);
		//short		bScrnCenter=1; //centerize
		//SetToWndRectEx(hpcih,m_hWnd,bScrnCenter);
		
		okCaptureToScreen(hpcih);
}

void RecImage::mSetRecSyn( WPARAM wParm, LPARAM lParm)
{
	okStopCapture(hpcih);
	okSetVideoParam(hpcih,wParm,lParm);
	okCaptureToScreen(hpcih);
	char ss[10];
	sprintf(ss,"0x%d",wParm);
	WritePrivateProfileString("OK_RGB10","SyncChann",ss,"Okadrv.ini");
}

void RecImage::mSetRecStn( WPARAM wParm, LPARAM lParm)
{
	okStopCapture(hpcih);
	okSetVideoParam(hpcih,wParm,lParm);
	okCaptureToScreen(hpcih);
	char ss[10];
	sprintf(ss,"0x%d",wParm);
	WritePrivateProfileString("OK_RGB10","TVStandard",ss,"Okadrv.ini");
}

void RecImage::mSetRecSrc( WPARAM wParm, LPARAM lParm)
{
	if(wParm==1)
	{
		okStopCapture(hpcih);
		okSetVideoParam(hpcih,1,0x200);
		okCaptureToScreen(hpcih);
		WritePrivateProfileString("OK_RGB10","SourceChan","0x200","Okadrv.ini");
	}
	else if(wParm==2)
	{
		okStopCapture(hpcih);
		okSetVideoParam(hpcih,1,0x201);
		okCaptureToScreen(hpcih);
		WritePrivateProfileString("OK_RGB10","SourceChan","0x201","Okadrv.ini");
	}
	else
	{
	}
}

void RecImage::mSetRecBri( WPARAM wParm, LPARAM lParm)
{
	//PCIHSetADParam(hpcih,AD_BRIGHTNESS,wParm);
	/*switch(wParm)
	{
	case 1:
	case 2:
	case 3:
		okStopCapture(hpcih);
		okSetVideoParam(hpcih,2,MAKELPARAM(lParm,wParm-1));
		okCaptureToScreen(hpcih);
		break;
	case 4:
	case 5:
	case 6:
		okStopCapture(hpcih);
		okSetVideoParam(hpcih,3,MAKELPARAM(lParm,wParm-4));
		okCaptureToScreen(hpcih);
		break;
	}*/ //Rem by RGB10
	okStopCapture(hpcih);
	okSetVideoParam(hpcih,2,wParm);
	okCaptureToScreen(hpcih);
}

void RecImage::RePhotoPic( WPARAM wParm, LPARAM lParm)
{

⌨️ 快捷键说明

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