我有 24 位图像,我读取位图并将其转换为灰度并像 8 位一样保存。
RGBTRIPLE temp;
unsigned char t;
...
t = (temp.rgbtBlue * 0.114 + temp.rgbtGreen * 0.587 + temp.rgbtRed * 0.299);
fwrite(&t, sizeof(UCHAR), 1, newFile);
在那个图像没有打开之后,我明白我必须在标题中进行更改。 我尝试更改标题中的文件大小和位图大小,但它没有用。
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
...
bfh.bfSize = sizeof(UCHAR) * img.Width * img.Height + bfh.bfOffBits;
bih.biSizeImage = sizeof(UCHAR) * img.Width * img.Height;
bih.biCompression = BI_BITFIELDS;
bih.biBitCount = 8;
保存图像如 8 位 BMP 我需要更改什么?
最佳答案
实际上,最简单的方法是不更改 header 中的任何内容。你读取 3 个值(RGB),使用标准的 PAL/NTSC 公式将它们转换为灰色,然后你可以将计算出的灰度值输出 3 次。这样,您将再次获得 1 个像素,但值已更改。
您仅仅更改标题是行不通的,因为对于 8 位、颜色索引 图像,您还需要提供颜色索引图 -- 调色板。此外,根据原始图像大小,您可能需要更改每行的步幅(这就是所谓的 - Google 也是您的 friend !)。
正如 Mark Setchell 所说,BI_BITFIELDS 不是您在这里需要的 (Wikipedia on BMP)。将 BI_RGB 用于真彩色或彩色索引图像;其他值非常专门化——而且我从未“在野外”见过它们。
关于c++ - 从 RGB BMP 创建灰度 BMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480726/