VC中怎么读取bmp文件的像素

 我来答
巨蟹天使之恋00
2017-06-16 · TA获得超过1466个赞
知道大有可为答主
回答量:1630
采纳率:22%
帮助的人:893万
展开全部
首先BMP文件包括两个部分:文件头和文件内容。我们可以得到公式:文件的字节长度=头文件的字节数+像素数。具体读取像素的思路以及代码如下:
第一步:判定文件是不是bmp文件。从文件里读取头文件,然后读取文件头的类型属性。
BITMAPFILEHEADER bmfHeader;
// 尝试读取DIB文件头
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
// 大小不对,返回NULL。
return NULL;
}
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if (bmfHeader.bfType != DIB_HEADER_MARKER)
{
// 非DIB对象,返回NULL。
return NULL;
}

第二步:用文件的字节数减去文件头的字节数后,读取后面的数据即是bmp的像素。
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
// 获取DIB(文件)长度(字节)
dwBitsSize = file.GetLength();
// 为DIB分配内存
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
if (hDIB == 0)
{
// 内存分配失败,返回NULL。
return NULL;
}

// 锁定
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 读象素
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
// 大小不对。

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

// 释放内存
::GlobalFree((HGLOBAL) hDIB);

// 返回NULL。
return NULL;
}

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式