首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从RGB BMP创建灰度BMP

从RGB BMP创建灰度BMP
EN

Stack Overflow用户
提问于 2013-12-10 05:03:10
回答 2查看 1.9K关注 0票数 1

我有24位的图像,我读取位图并将其转换为灰度,然后保存为8位。

代码语言:javascript
复制
RGBTRIPLE temp;
unsigned char t;
...
t = (temp.rgbtBlue * 0.114 + temp.rgbtGreen * 0.587 + temp.rgbtRed * 0.299);
fwrite(&t, sizeof(UCHAR), 1, newFile);

在那个图像没有打开之后,我明白了我必须在标题中进行修改。我尝试更改文件大小和头文件中的位图大小,但不起作用。

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

发布于 2013-12-10 05:49:57

实际上,最简单的方法是不更改头部中的任何内容。读取3个值(RGB),使用标准PAL/NTSC公式将它们转换为灰色,然后可以将计算出的灰度值输出3次。这样一来,你又得到了1个像素,但是改变了值。

仅更改标题是行不通的,因为对于8位颜色索引图像,还需要提供颜色索引映射--调色板。此外,根据原始图像的大小,您可能需要更改每行的步幅(这就是它的名称-- Google也是您的朋友!)。

正如Mark Setchell所说,这里(Wikipedia on BMP)不需要BI_BITFIELDS。对于真彩色或彩色索引图像,请使用BI_RGB;其他值是非常特殊的--我从来没有“在野外”看到过它们。

票数 2
EN

Stack Overflow用户

发布于 2019-04-11 09:39:20

如果使用Gdiplus类Bitmap的成员函数ConvertFormat,会容易得多

代码语言:javascript
复制
void GrayScale(Bitmap* bmp)
{
    void* p = malloc(sizeof(Gdiplus::ColorPalette) + 255 * sizeof(ARGB));
    Gdiplus::ColorPalette *cpal = (Gdiplus::ColorPalette*)p;
    for (int i = 0; i < 256; i++) cpal->Entries[i] = Color::MakeARGB(0, i, i, i);
    cpal->Flags = PaletteFlagsGrayScale;
    cpal->Count = 256;
    bmp->ConvertFormat(PixelFormat8bppIndexed, DitherTypeSolid, PaletteTypeCustom, cpal, 0);
    free(p);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20480726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档