繁体   English   中英

转换为真正的8bpp Jpeg

[英]Converting to real 8bpp Jpeg

我已经在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()就像一个超级按钮。

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


如果要将颜色深度减小为每个像素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上找到的更长解释的修改示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM