📄 recimage.cpp
字号:
// 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 + -