我需要以原始 bpp 处理和保存图像(1 - 用于 BnW,8 - 用于灰色,24 - 彩色)。
处理后我总是有 24bpp(由于使用 Aforge.Net 处理)。我将原始 bpp 传递给保存功能,我正在使用下一个代码进行保存:

private static Bitmap changePixelFormat(Bitmap input, PixelFormat format)
    {
        Bitmap retval = new Bitmap(input.Width, input.Height, format);
        retval.SetResolution(input.HorizontalResolution, input.VerticalResolution);
        Graphics g = Graphics.FromImage(retval);
        g.DrawImage(input, 0, 0);
        g.Dispose();
        return retval;
    }

当我通过时:
PixelFormat.Format8bppIndexed

我收到一个异常:“图形对象无法以索引像素格式创建图像”在行中:
Graphics g = Graphics.FromImage(retval);

我试过下一个代码:
Bitmap s = new Bitmap("gray.jpg");
        Bitmap NewPicture = s.Clone(new Rectangle(0, 0, s.Width, s.Height),                   PixelFormat.Format8bppIndexed);

在此“NewImage”具有 PixelFormat 8bppIndexed 之后,但是当我保存 NewImage 时:
NewPicture.Save("hello.jpg", ImageFormat.Jpeg);

hello.jpg 有 24bpp。

我需要保留原始图像的 bpp 和图像格式。

为什么 Bitmap.Save 会忽略 Bitmap 的 PixelFormat?

================================================== ======

谢谢各位,我找到了解决办法:
http://freeimage.sourceforge.net/license.html

在这个免费库的帮助下,可以将图像(尤其是 JPEG )保存为 8 位灰度。

最佳答案

这是将位图转换为 1bpp/8bpp 位图的代码。 1bpp/8bpp in C#.

在您的 changePixelFormat 方法中,您可以检查需要转换为哪种固定格式,然后如果是 1bpp 或 8 bpp,则使用链接中的代码,对于所有其他格式,请使用您的代码。
Graphics.FromImage documentation 有备注:



新部分:

这是我在短暂的谷歌搜索后发现的:

gdiplus 版本不支持 8bpp 灰度图像和 8bpp jpg
1.0. Windows 7 中有一个新版本的 gdiplus 支持灰度
图像和更多增强的编解码器支持。

支持 8bpp 索引 jpeg 图像
微软的 WIC API。

您可以通过从 Microsoft 下载 WIC 资源管理器来自己尝试
下载网站。

GDI+ 8 bit load/save bug

标准 JPEG 仅支持 24 位图像。

10-06 07:30