c++ - BMP 阅读器无法正常工作

标签 c++ binary-data bmp

我为 24 位 BMP 编写了一个小型 BMP 加载器,它可以工作,只是它不显示颜色。一切都是灰度的,到处都有一些颜色(不是正确的)。我的代码的加载器在下面

void BMP::Read(char* filename)
{
    FILE* f;
    unsigned char info[54];
    if ((f = fopen(filename, "rb")) == NULL) return;
    fread(info, sizeof(unsigned char), 54, f);
    m_width = *(int*)&info[18];
    m_height = *(int*)&info[22];
    m_size = 3* m_width * m_height;
    m_pdata = new unsigned char[m_size];
    fread(m_pdata, sizeof(unsigned char), m_size, f);
    fclose(f);
}

然后我使用以下公式访问数组:

red = m_pdata[(y * m_width + x) + 2];
blue = m_pdata[(y * m_width + x) + 0];
green = m_pdata[(y * m_width + x) + 1];

这里有什么建议吗?我认为问题出在加载函数中,但不确定。

最佳答案

您在提取像素 channel 时忘记包括像素宽度:

int pixel_width = 3; // 3 bytes for 24 bit

根据 Strange values when reading pixels from 24-bit bitmap ,每行末尾也有填充。填充可以通过以下方式计算:

int row_padding = (4 - (m_width * pixel_width) % 4) % 4;

访问像素颜色 channel 的最终结果公式为:​​

red = m_pdata[(y * m_width + x) * pixel_width + y * row_padding + 2];
blue = m_pdata[(y * m_width + x) * pixel_width + y * row_padding + 0];
green = m_pdata[(y * m_width + x) * pixel_width + y * row_padding + 1];

由于行有填充,您计算的 m_size 稍微太小了。您可以将行填充考虑为:

m_size = pixel_width * m_width * m_height + row_padding * m_height;

关于c++ - BMP 阅读器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200934/

相关文章:

python - 使用 numpy 数组时,struct.pack 在 python 2.6 中要慢得多

java - java中BMP图像的压缩与解压

c++ - 将 Bmp 灰度读入 C

c++ - 如何将任何 DLL 链接到 Cmake 项目

c++ - STL 算法可以与循环列表一起使用吗?

c++ - 奇怪的 strncpy 用法

java - 比较二进制数据和逐行字符串哪个更快?

C++ 错误数组和结构

encoding - 如何将 Dart 的 ByteData 转换为字符串?

c++ - 如何在 C++ 中将图像从 .bmp 转换为 .png