BMP reader 未正常运行
BMP reader not functioning correctly
我为 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];
这里有什么建议吗?我认为问题出在加载函数中,但不确定。
您在提取像素通道时忘记包含像素宽度:
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;
访问像素颜色通道的最终结果公式为:
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;
我为 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];
这里有什么建议吗?我认为问题出在加载函数中,但不确定。
您在提取像素通道时忘记包含像素宽度:
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;
访问像素颜色通道的最终结果公式为:
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;