【问题标题】:How to read raster with libbmp?如何用 libbmp 读取光栅?
【发布时间】:2015-02-11 18:49:41
【问题描述】:

昨天我下载了这个库: http://code.google.com/p/libbmp/ 他们说这个 C 库是为轻松读取、写入和修改 Windows 位图 (BMP) 图像文件而设计的。但我找不到任何读取位图的功能。有人知道如何在 C 中读取位图(图像中的 rgb 像素)吗?我使用 CodeBlocks IDE。

【问题讨论】:

    标签: c bitmap


    【解决方案1】:

    我在该代码中没有看到任何读取(加载)功能,因此描述有点可疑。

    我查看了the code,没有调用open()使用读取模式,函数bmp_create()不支持加载现有文件。

    图书馆似乎不完整。

    您可以查看其他库,也许是 EasyBMP(看起来很旧,但另一方面,BMP 格式也是如此)。

    【讨论】:

    • 我去了 lib 的页面,但没有找到任何文档。你知道文档在哪里吗?
    • @PaulOgilvie 不知道,我只是快速浏览了代码。这是一个单一的 C 文件。
    • EasyBMP 是 C++ 库,我用的是 C
    【解决方案2】:

    以下函数读取 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);
    }
    

    【讨论】:

    • 感谢您的代码。我正在尝试编写一些函数将其添加到库中。 bitmap.c 包含有关位图标头的一些基本信息,因此我可以尝试查找位图数据。期望标头由这些组成:uint8_t magicNo[2]; uint32_t fsize; uint16_t creator1; uint16_t creator2; uint32_t offset; 偏移量是位图像素数据的开始。
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2021-02-06
    • 2017-11-29
    • 1970-01-01
    相关资源
    最近更新 更多