我在图像处理方面工作了一段时间,我注意到了一些奇怪的事情。 我正在读取 BMP 文件,使用 ReadFile 等简单方法,并使用 Microsoft 的 BMP 结构。 这是代码:
ReadFile(_bmpFile,&bmpfh,sizeof(bfh),&data,NULL);
ReadFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
imagesize = bih.biWidth*bih.biHeight;
image = new RGBQUAD[imagesize];
ReadFile(_bmpFile,image, imagesize*sizeof(RGBQUAD),&written,NULL);
这就是我读取文件的方式,然后使用简单的 for 循环将其转换为灰度。
for (int i = 0; i < imagesize; i++)
{
RED = image[i].rgbRed;
GREEN = image[i].rgbGreen;
BLUE = image[i].rgbBlue;
avg = (RED + GREEN + BLUE ) / 3;
image[i].rgbRed = avg;
image[i].rgbGreen = avg;
image[i].rgbBlue = avg;
}
现在,当我使用这段代码编写文件时:
#pragma pack(push, 1)
WriteFile(_bmpFile, &bmpfh, sizeof(bfh), &data, NULL);
WriteFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
WriteFile(_bmpFile, image, imagesize*sizeof(RGBQUAD), &written, NULL);
#pragma pack(pop)
文件越来越大(30MB -> 40MB)。
发生这种情况的原因是因为我使用的是 RGBQUAD 而不是 RGBTRIPLE,但是如果我使用的是 RGBTRIPLE,我在将small pictures 转换为 灰度 - 创建后无法打开图片(说它的结构不正确)。
文件大小也少了一个字节,(1174kb 和 1173kb 之后)
有没有人以前见过这个(它只发生在小图片上)?
最佳答案
在 BMP 文件中,必须填充每条扫描线,以便下一条扫描线从 32 位边界开始。如果您使用每像素 32 位,这会自动发生,但如果您使用每像素 24 位,则需要添加代码以明确执行。
关于c++ - 创建 BMP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5444145/