4

我需要以原始 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 位。

4

4 回答 4

5

我几乎可以肯定 JPEG 图像格式不支持索引图像。因此,即使您创建了指定的图像PixelFormat.Format8bppIndexed,当您尝试将其保存为 JPEG 时,GDI+ 也会将其转换为不同的格式。在本例中,您已经确定为 24 bpp。

相反,您需要将图像另存为 BMP 或 GIF。例如:

NewPicture.Save("hello.jpg", ImageFormat.Bmp);

在 Wikipedia 上查看支持索引颜色的图像文件格式表。

于 2011-01-13T12:24:44.777 回答
4

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

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

Graphics.FromImage 文档有备注:

如果图像具有索引像素格式,则此方法会引发异常并显示消息“无法从具有索引像素格式的图像创建图形对象”。索引像素格式如下表所示。

Format1bppIndexed

Format4bppIndexed

Format8bppIndexed

新零件:

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

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

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

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

GDI+ 8 位加载/保存错误

标准 JPEG 仅支持 24 位图像。

于 2011-01-13T12:41:47.657 回答
0

如果您正在寻找真正的 8 位灰度位图图像,那么我在StackOverflow上发表了一篇关于它的详细信息。它适用于任何操作系统(Windows/Mac/Linux),而不仅仅是 Windows 7。我希望它有所帮助。

于 2011-04-23T14:57:29.143 回答
0

对非索引图像使用 Graphics 类。处理索引图像时使用Bitmap.LockBits 和 Bitmap.UnlockBits

于 2013-05-06T06:03:58.180 回答