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