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

时间:2010-10-29 09:32:53

标签: 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 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;
}

任何想法出了什么问题?

谢谢, 弗兰克

3 个答案:

答案 0 :(得分:3)

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

现在,代码中的16位图像?这是原始的不精确的内存近似,仅使用65535种颜色。当您将其保存回来时,您将获得24位JPEG。显然,您的JPEG编码器不知道如何创建48位JPEG。即使它确实如此,但由于内存中的图像只有65536种颜色,因此会浪费一些。

总结一下:这个任务出了什么问题。没有像65536色JPEG那样的东西。

答案 1 :(得分:2)

这个问题有点陈旧,但我会为将来搜索的人添加此内容。

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

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

convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg

答案 2 :(得分:2)

JPEG是一种三色格式,不允许您另存为16位深度,但bmp格式可以。 我遇到了同样的问题,并按以下方法解决了。希望对您有帮助。

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