我需要处理并保存原始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位灰度。
答案 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资源管理器自行尝试 下载网站。
标准JPEG仅支持24位图像。
答案 2 :(得分:0)
如果你正在寻找一个真正的8位灰度位图图像,那么我就它做了一个detailed StackOverflow post。它适用于任何操作系统(Windows / Mac / Linux),而不仅仅是Windows 7.我希望它有所帮助。
答案 3 :(得分:0)
对非索引图像使用Graphics类。 处理索引图像时使用Bitmap.LockBits和Bitmap.UnlockBits