【发布时间】:2015-02-11 18:49:41
【问题描述】:
昨天我下载了这个库: http://code.google.com/p/libbmp/ 他们说这个 C 库是为轻松读取、写入和修改 Windows 位图 (BMP) 图像文件而设计的。但我找不到任何读取位图的功能。有人知道如何在 C 中读取位图(图像中的 rgb 像素)吗?我使用 CodeBlocks IDE。
【问题讨论】:
昨天我下载了这个库: http://code.google.com/p/libbmp/ 他们说这个 C 库是为轻松读取、写入和修改 Windows 位图 (BMP) 图像文件而设计的。但我找不到任何读取位图的功能。有人知道如何在 C 中读取位图(图像中的 rgb 像素)吗?我使用 CodeBlocks IDE。
【问题讨论】:
以下函数读取 BMP:
char *DIBreadBmp (char *szFilename)
{
BITMAPFILEHEADER *pBmf;
DWORD dwBitsSize;
char *pDIB;
int fd;
if ((_sopen_s (&fd, szFilename,(_O_RDONLY|_O_BINARY), _SH_DENYWR,(_S_IREAD|_S_IWRITE))) != 0) {
LogError (ERR_FILENOTFOUND, szFilename);
return (0);
}
// get length of DIB in bytes for use when reading
dwBitsSize = _filelength (fd);
// Go read the DIB file header and check if it's valid.
pBmf = malloc (sizeof(BITMAPFILEHEADER));
if ((_read (fd, (LPSTR) pBmf, sizeof (BITMAPFILEHEADER)) != sizeof (BITMAPFILEHEADER))
|| (pBmf->bfType != DIB_HEADER_MARKER))
{
free(pBmf);
_close (fd);
LogError (ERR_NOT_DIB, szFilename);
return (0);
}
// Allocate memory for DIB
if (!(pDIB= malloc(dwBitsSize - sizeof(BITMAPFILEHEADER))))
{
free(pBmf);
_close (fd);
LogError (ERR_MEMORY, szFilename);
return (0);
}
// Go read the bits.
if (!_read (fd, pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)))
{
free(pDIB);
free(pBmf);
_close (fd);
LogError (ERR_READ, szFilename);
return (0);
}
_close (fd);
free(pBmf);
return (pDIB);
}
【讨论】:
uint8_t magicNo[2]; uint32_t fsize; uint16_t creator1; uint16_t creator2; uint32_t offset; 偏移量是位图像素数据的开始。