DirectShow实务精选 AVCap抓图失败(前十位回答必有分,灌水除外)

薛123 2014-03-19 10:05:25
/将图像数据保存为BMP文件
void CImageGrabberFilter::WriteImageFile(BYTE * inData,
long inSize,
const char * inFile)
{
BITMAPINFOHEADER info;
GetBitmapInfoHeader(&info);
int nColors = 1 << info.biBitCount;
if (nColors > 256)
{
nColors = 0;
}

long isRGB565 = 0;
//判断输入图像是不是16位的RGB格式,是RGB555还是RGB565
//如果是,则要在BMP信息头后面跟3个DWORD类型的屏蔽字
BOOL is16Bits = Is16BitsRGB(&isRGB565);
const DWORD bits555[] = {0x7C00,0x03E0,0x001F};
const DWORD bits565[] = {0xF800,0x07E0,0x001F};

//定义BMP文件头
BITMAPFILEHEADER hdr;
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // always is "BM"
hdr.bfSize = inSize + sizeof(hdr) + sizeof(BITMAPINFOHEADER);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + info.biSize + nColors * sizeof(RGBQUAD));


//如果是16位RGB格式,需要修正如下成员(因为加入了3个屏蔽字)
if (is16Bits)
{
hdr.bfSize += 12;
hdr.bfOffBits += 12;
}

#ifdef _DEBUG
int offset1 = sizeof(BITMAPFILEHEADER);
int offset2 = sizeof(BITMAPINFOHEADER);
#endif

FILE * fp = fopen(inFile, "wb");
if (fp != NULL)
{
//写入BMP文件头
fwrite(&hdr, sizeof(char), sizeof(BITMAPFILEHEADER), fp);
//写入BMP信息头
fwrite(&info, sizeof(char), sizeof(BITMAPINFOHEADER), fp);
// Here, if nColors less than 256, need write RGBQUAD
// ...
if (is16Bits)
{
if (isRGB565 == 1) // RGB565
{
fwrite(bits565, sizeof(DWORD), 3, fp);
}
else // RGB555
{
fwrite(bits555, sizeof(DWORD), 3, fp);
}
}

fwrite(inData, sizeof(char), inSize, fp);
fclose(fp);
}
}
...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
__cc__ 2014-03-19
  • 打赏
  • 举报
回复
楼主要问的是抓图失败,还是保存为BMP失败呢? 如果是保存BMP失败,只能说明是格式信息填写错误。
薛123 2014-03-19
  • 打赏
  • 举报
回复
引用 1 楼 neustar1 的回复:
楼主要问的是抓图失败,还是保存为BMP失败呢? 如果是保存BMP失败,只能说明是格式信息填写错误。
SimplePlayer点播保存的bmp格式能打开,SourceCodes\Chapter02\AVCap预览保存的bmp格式不能打开,原来是我电脑有问题,在别人电脑上就能打开,所以分都给你啦,结贴

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧