我有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?
发布于 2013-12-10 05:49:57
实际上,最简单的方法是不更改头部中的任何内容。读取3个值(RGB),使用标准PAL/NTSC公式将它们转换为灰色,然后可以将计算出的灰度值输出3次。这样一来,你又得到了1个像素,但是改变了值。
仅更改标题是行不通的,因为对于8位颜色索引图像,还需要提供颜色索引映射--调色板。此外,根据原始图像的大小,您可能需要更改每行的步幅(这就是它的名称-- Google也是您的朋友!)。
正如Mark Setchell所说,这里(Wikipedia on BMP)不需要BI_BITFIELDS。对于真彩色或彩色索引图像,请使用BI_RGB;其他值是非常特殊的--我从来没有“在野外”看到过它们。
发布于 2019-04-11 09:39:20
如果使用Gdiplus类Bitmap的成员函数ConvertFormat,会容易得多
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);
}https://stackoverflow.com/questions/20480726
复制相似问题