我在图像处理方面工作了一段时间,我注意到一些奇怪的事情。我正在读取 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,我在将小图片转换为灰度时遇到问题 - 创建图片后无法打开图片(说它的结构不正确) .
文件大小也缺少一个字节,(1174kb 和 1173kb 之后)
有没有人见过这个(它只出现在小图片上)?