c++ - 从 RGB BMP 创建灰度 BMP

标签 c++ c bitmap

我有 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/

相关文章:

c++ - 在专用线程中清除 STL

c - %20[^\n] 是什么格式?

c# - 保存图像时如何修复此 GDI+ 通用异常?

android - 可以移动平铺背景吗? (使用 TileMode.REPEAT 无限滚动)

WPF,C# : Draw a line onto existing bitmap in image control

c++ - C和C++中的全局变量有什么区别?

c++ - 两个 TypeSets/Tuples 中的公共(public)类型

c++ - 我该如何修复此代码?

c - 在 C 中显示 float

c - 在 C 中多线程密码检查器