我已经搜索并尝试了在SO,AForge,FreeImage以及更多网站上提供的所有建议,但我无法将图像转换为真正的8bpp图像。我总是将JPEG保存为24bpp而不是8。
灰度转换后我有一个MemoryBMP(根据myImage.RawFormat),所以当我像这样保存时
myImage.Save("image.jpg");
我得到一张3Mb +图像(所以我认为它保存在BMP中),Windows告诉我的是8bpp(但我需要它是JPEG)。但如果我像这样保存它
myImage.Save("image_JPEG.jpg", ImageFormat.Jpeg);
我得到一张400Kb的图像(所以我假设它以JPEG格式保存)但是它是24bpp。
任何想法可能导致什么?
修改
正如JYelton所说,这是Image.Save()方法的限制,所以我改为使用FreeImage库保存图像:FreeImage.SaveBitmap()就像魅力一样。
答案 0 :(得分:0)
更新:Image.Save()
方法不支持JPEG格式的每像素8位。您可能希望使用FreeImage library代替,如下面的评论所述。
如果要将颜色深度降低到每像素8位,通常与从24位颜色转换为灰度相同,其中每个颜色通道的每像素数为8位。 (换句话说,将3个颜色信息通道减少到1个。)
使用Image.Save()
并指定ImageFormat.Jpeg
时的默认编码器为24 bpp,因此您需要指定编码器并提供一些参数:
ImageCodecInfo[] availableCodecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpgCodec = availableCodecs.FirstOrDefault(codec => codec.MimeType == "image/jpeg");
if (jpgCodec == null)
throw new NotSupportedException("Encoder for JPEG not found.");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8L);
myImage.Save("image_JPEG.jpg", jpgCodec, encoderParams);
这是我在aspnet-answers.com找到的较长解释的修改示例。