我需要将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;
}
任何想法出了什么问题?
谢谢, 弗兰克
答案 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);