c++ - 创建 BMP 文件

标签 c++ image-processing file-io bmp

我在图像处理方面工作了一段时间,我注意到了一些奇怪的事情。 我正在读取 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/

相关文章:

android - 用opencv全屏显示图像

go - 并发文件系统扫描

postgresql - HAProxy 拆分读/写 postgresql

c++ - 如何为 C++ 程序禁用 VirtualStore?

c++ - 在将参数传递给基类时使用 std::move()

image - 如何改进我的图像比较算法

c++ - 回溯算法卡住了

python - python中的OpenCV轮廓最小尺寸位置

c++ - 位字段结构分配意外行为

c++ - 编写一个最小的自定义运算符:std::sort 需要为我的类型定义 std::__lg