C# 转换为真正的8bpp Jpeg

C# 转换为真正的8bpp Jpeg,c#,.net,image-processing,C#,.net,Image Processing,我已经搜索并尝试了在SO、AForge、FreeImage和其他几个网站上提供的所有建议,但我无法将一张图片转换成真正的8bpp图片。我总是将JPEG保存为24bpp,而不是8 在灰度转换之后,我有一个MemoryBMP(根据myImage.RawFormat),所以当我像这样保存它时 myImage.Save("image.jpg"); 我得到一个3Mb+的图像(所以我假设它保存在BMP中),Windows告诉我它是8bpp(但我需要它是JPEG)。但如果我这样保存它 myImage.Sav

我已经搜索并尝试了在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()工作起来很有魅力。

更新:对于JPEG格式,
Image.Save()方法不支持每像素8位。您可能希望使用,如下面的注释中所述


如果要将颜色深度减少到每像素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);

这是我在上找到的一个较长解释的修改示例。

为什么需要将JPG设置为8位?仅供参考,有些人似乎将每个通道(R、G、B)有8位的图像称为“8位JPG”。如果这就是你想要的,那么我想你已经得到了。每个通道8位产生24位颜色。图像的默认图像格式。保存(字符串)重载是PNG,而不是BMP。尝试使用编码器参数,但没有任何区别。进行了2次保存:myImage.Save(“image\u JPEG.jpg”,ImageFormat.JPEG);和myImage.Save(“image_JPEG.jpg”,jpgCodec,encoderParams);,afet做了一个二进制文件比较,两个文件完全相同。只是尝试了EncoderParameters来指定TIFF格式的颜色深度,它工作正常,但在Jpeg中没有差异。一个相关问题表明Image.Save不支持8bpp,我不知道这一点。这需要更多的调查。@Gonçalo Cardoso答案是否正确?接受答案,然后在评论中说它不起作用是没有帮助的。@Ecnerwal我更新了答案以反映图像。Save()限制为8bpp JPEG格式,并根据评论建议OP的解决方案。也许现在这件事不会给你带来太多麻烦了。