HANDLE m_hcam;
m_hcam=CreateFile(".//HCD0",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); //获得摄像头的句柄
if(m_hcam==INVALID_HANDLE_VALUE){printf("can't open");}
//使能并初始化摄像头的控制码
DeviceIoControl(m_hcam, //设备句柄名
IOCTL_CAM_CONT, //使能并初始化摄像头的控制码
NULL, //输入数据
0, //输入数据长度
&chPrevEnable, //输出数据
1, //输出数据长度
&dwBytesReceive, //输出数据实际长度
NULL); //重载操作结构指针
///获得一帧的数据
typedef struct PINGPONG_PR
{
unsigned int rgb_address; //RGB信息的内存地址
unsigned char flag; //读标志位
} PINGPONG_PR;
PINGPONG_PR image; //定义结构体用于存RGB图像地址;
DeviceIoControl(m_hcam,
CAM_IOCTL_SAMSUNG_CAM_PR,//获得最近一帧RGB图像内存地址的操作码
NULL,
NULL,
(PBYTE)&image,
NULL,
NULL,
NULL);
//将内存地址中的数据保存
WORD width=GetSystemMetrics(SM_CXSCREEN);
WORD height=GetSystemMetrics(SM_CYSCREEN);//屏幕尺寸
BYTE* DDBdata=new BYTE[width*height*2];//分配用于存数据的空间
BYTE* DIBdata;
memcpy(DDBdata,(void *)image.rgb_address,width*height*2);//将这帧图像数据存入内存
//数据创建位图 不好意思啊,这里好象有错误,我弄的时候老是出错,该正中!
CBitmap bitmap;//位图
HBITMAP dstBmp;//位图句柄
bitmap.CreateBitmap(width,height,1,16,DDBdata);//用数据创建一张位图
HDC hdcSrc = CreateCompatibleDC(NULL);
HDC hdcDst = CreateCompatibleDC(NULL);//创建与应用程序的当前显示设备兼容的内存DC返回其句柄
BITMAPINFOHEADER bih={0};//位图信息头,记录BMP本身信息,与图像数据无关
bih.biBitCount = 16;//每个像素字节大小
bih.biCompression= BI_RGB;//未压缩格式
bih.biHeight = height;//高度
bih.biPlanes= 1;
bih.biSize= sizeof(BITMAPINFOHEADER);
bih.biSizeImage = width*height*2;//图像数据大小
bih.biWidth = width;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + width*height*2;//文件总的大小
bfh.bfType = (WORD)0x4d42;//BM,位图标记
BITMAPINFO bi={0};位图信息结构,包含BITMAPINFOHEADER和图像数据
bi.bmiHeader=bih;
dstBmp=CreateDIBSection(hdcDst,
(BITMAPINFO*)&bi, //指定位图各种属性
DIB_RGB_COLORS,
(void **)&DIBdata,//接收指向DIB位数据值的指针
NULL,//系统为DIB分配内存
0);//创建应用程序可直接写入的DIB并返回位图句柄
SelectObject(hdcDst, dstBmp);
SelectObject(hdcSrc, bitmap);//选择一对象到指定DC环境中
//将位图复制到实际的设备环境中
BitBlt(hdcDst, //目标设备环境句柄
0, 0, //左上角坐标
width,
height,
hdcSrc, //源设备环境句柄
0, 0,
SRCCOPY);//直接拷贝
//将数据保存
CFile file("123.bmp",//文件名 这个地方好像也有问题,好像是_T("123.bmp"),
CFile::modeCreate|CFile::modeReadWrite);//可读可写
file.Write(&bfh,sizeof(bfh));//写入文件头
file.Write(&bih,sizeof(bih));//写入图像本身信息
file.Write(DIBdata,width*height*2);//写入图像数据
file.Close();//关闭文件
delete DDBdata;//回收内存
假设获得一帧数据的操作码所获得的是RGB数据地址,如果得到YcbCr数据,需转换成JPG
可以通过定时器获取帧,以到达录像作用,或调用驱动提供的录像控制码