以较低的位深度保存jpg(例如24到16)(C#)

以较低的位深度保存jpg(例如24到16)(C#),c#,image,system.drawing,C#,Image,System.drawing,我需要将24位和32位jpeg和png文件转换为较低的位深度(16)。我找到了一些代码来实现这一点,但是生成的图像保持了原始文件的位深度,尽管文件大小较低 Image img = Image.FromFile(filePathOriginal); Bitmap bmp = ConvertTo16bpp(img); EncoderParameters parameters = new EncoderParameters(); parameters.Param[0] = new EncoderPar

我需要将24位和32位jpeg和png文件转换为较低的位深度(16)。我找到了一些代码来实现这一点,但是生成的图像保持了原始文件的位深度,尽管文件大小较低

Image img = Image.FromFile(filePathOriginal);
Bitmap bmp = ConvertTo16bpp(img);
EncoderParameters parameters = new EncoderParameters();
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 16);
bmp.Save(filePathNew, jpgCodec, parameters);
bmp.Dispose();
img.Dispose();

...

private static Bitmap ConvertTo16bpp(Image img) {
    var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
    using (var gr = Graphics.FromImage(bmp))
    {
         gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
    }

    return bmp;
}
你知道怎么回事吗

谢谢,
Frank

JPEG是一种三色格式。它通常每种颜色有8位,但可以有12或16位。因此,24=3x8位的颜色是合理的,但16或32位根本不可能。它就是不被三除。3x16=48是可能的,但这是一个更高的颜色深度。JPEG是为照片而设计的,支持低于3x8的位深度是没有意义的。这没有好处

现在,代码中的16位图像是什么?这是一个在内存中不精确的原始近似值,仅使用65535种颜色。当你把它存回去的时候,你会得到一个24位的JPEG。显然,您的JPEG编码器不知道如何创建48位JPEG。即使是这样,也会浪费比特,因为内存中的图像无论如何只有65536种颜色


总而言之:出问题的是任务。没有65536色JPEG这样的东西

这个问题有点老了,但我将为以后搜索的任何人添加这个问题

如果它是一个32位文件,那么它很可能位于CMYK颜色空间中。这通常用于打印,但非常罕见,许多使用RGB和屏幕显示而不是打印的工具无法处理它

您可以使用imagemagic将其转换为RGB:

convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg

JPEG是一种三色格式,不允许保存为16位深度,但bmp格式允许。 我遇到了同样的问题,我解决了它如下。希望它能帮助你

bmp.Save("test.jpeg", ImageFormat.Bmp);

我很怀疑这个问题。JPEG是一种三色格式。它通常每种颜色有8位,但可以有12或16位。因此,24=3x8位的颜色是合理的,但16或32位根本不可能。它就是不被三除。3x16=48是可能的,但这是一个更高的颜色深度。实际上,32位可能是颜色的3x8,第四个通道可能是alpha(透明度)。。。使用是愚蠢的,因为jpeg不支持透明的msalters。我能理解你回答的逻辑。如果我比较原始图像和转换后的图像,它们都有24位的深度,但是测试图像的文件大小从2218KB减少到959KB。当我比较图像质量时,没有太大的差别,只是转换后的图像有点暗。另一个差别:对于png,透明度是lost@Frank:难怪在PNG方面,内存中减少到65536色位图会去掉alpha通道。你也拿不回来。至于JPEG大小的减少,这是意料之中的。减少到65536色将消除小的色差,否则需要进行编码。然而,JPEG压缩有一个“质量”因素。较低质量的压缩也会消除小细节,但会优先消除人眼不太敏感的细节。对于你的问题,这可能是一个更好的选择。