各位大侠,求帮助啊,我用网上提供的抓取一帧的示例代码,在我的板子上测试,我用的是TQ2440开发板,OV9650的摄像头,WinCE5.0的系统,结果保存下来的bmp图总是错位的,不知道为什么..代码没有改动过..
代码如下:
- C/C++ code
PINGPONG_PR image; WORD width=GetSystemMetrics(SM_CXSCREEN); WORD height=GetSystemMetrics(SM_CYSCREEN); BOOL ret; BYTE* DDBdata=new BYTE[width*height*2]; BYTE* DIBdata; if(width>640) width=640; if(height>480) height=480; ret=DeviceIoControl(m_hled,CAM_IOCTL_SAMSUNG_CAM_PR,NULL,NULL,(PBYTE)&image,NULL,NULL,NULL); if(!ret) AfxMessageBox(_T("读取图片失败!")); else { SetKMode(TRUE); memcpy(DDBdata,(void *)image.rgb_address,width*height*2); SetKMode(FALSE); CBitmap bitmap; HBITMAP dstBmp; bitmap.CreateBitmap(width,height,1,16,DDBdata); HDC hdcSrc = CreateCompatibleDC(NULL); HDC hdcDst = CreateCompatibleDC(NULL); BITMAPINFOHEADER bih = {0};//位图信息头 bih.biBitCount = 16;//每个像素字节大小 bih.biCompression = BI_RGB; bih.biHeight = height;//高度 bih.biPlanes = 1; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biSizeImage = 0;// 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; BITMAPINFO bi={0}; bi.bmiHeader=bih; dstBmp=CreateDIBSection(hdcDst, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void **)&DIBdata, NULL, 0); SelectObject(hdcDst, dstBmp); SelectObject(hdcSrc, bitmap); BitBlt(hdcDst, 0, 0, width, height, hdcSrc, 0, 0, SRCCOPY); CFile file(_T("image.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;
------解决方案--------------------
也有可能是硬件的问题,ov9650的I2C总线如果线太长就不能正常完成设置,出来的图像就有可能有错,另外看一下你BSP中对图像preview的宽高设置跟应用程序是否一致
------解决方案--------------------
楼主问题解决了吗,我也弄这个,一起讨论下吧
QQ272685110