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