转换为真正的8bpp Jpeg

时间:2014-07-21 17:48:50

标签: c# .net image-processing

我已经搜索并尝试了在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()就像魅力一样。

1 个答案:

答案 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找到的较长解释的修改示例。