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

时间:2011-01-13 12:08:17

标签: c# image-processing bitmap pixelformat

我需要处理并保存原始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 个答案:

答案 0 :(得分:5)

我几乎肯定JPEG图像格式不支持索引图像。因此,即使您创建了指定PixelFormat.Format8bppIndexed的图像,当您尝试将其保存为JPEG时,GDI +也会将其转换为其他格式。在这种情况下,你已经确定是24 bpp。

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

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

请参阅支持索引颜色here on Wikipedia的图像文件格式表。

答案 1 :(得分:4)

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

在你的changePixelFormat方法中,你可以检查它需要转换成什么样的fixel格式,然后如果它是1bpp或8 bpp那么使用链接中的代码和所有其他格式使用你的代码。

Graphics.FromImage documentation发表评论:

  

如果图像具有索引像素   格式,这个方法抛出一个   消息的异常," A.   无法创建图形对象   具有索引像素的图像   。格式#&34;索引像素格式是   如下表所示。

     

Format1bppIndexed

     

Format4bppIndexed

     

Format8bppIndexed

新篇幅:

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

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

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

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

GDI+ 8 bit load/save bug

标准JPEG仅支持24位图像。

答案 2 :(得分:0)

如果你正在寻找一个真正的8位灰度位图图像,那么我就它做了一个detailed StackOverflow post。它适用于任何操作系统(Windows / Mac / Linux),而不仅仅是Windows 7.我希望它有所帮助。

答案 3 :(得分:0)

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