我需要转换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;
}你知道哪里出问题了吗?
谢谢,弗兰克
发布于 2010-10-29 17:49:24
JPEG是一种三色格式。每种颜色通常有8位,但也可以有12位或16位。因此,颜色的24=3x8位是合理的,但16位或32位根本不可能。它就是不能被三除。3x16=48是可能的,但那是一个较高的颜色深度。JPEG是为照片设计的,支持低于3x8的位深度是没有意义的。这样做没有任何好处。
现在,你代码中的16位图像是什么?它是原始图像的内存中不精确的近似值,仅使用65535种颜色。当你把它存回去的时候,你会得到一个24位的JPEG。显然,您的JPEG编码器不知道如何创建48位JPEG。即使它这样做,也是浪费比特,因为内存中的图像只有65536种颜色。
总而言之:哪里出了问题就是任务。没有65536色JPEG这样的东西。
发布于 2014-08-26 22:43:14
这个问题有点老了,但我会为将来搜索的任何人添加这个问题。
如果它是一个32位文件,那么它很可能是在CMYK色彩空间中。这通常用于打印,但它非常罕见,以至于许多使用RGB和显示到屏幕而不是打印的工具无法处理它。
您可以使用imagemagic将其转换为RGB:
convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg发布于 2018-07-20 18:48:07
JPEG是一种三色格式,它不允许保存为16位深度,但bmp格式可以。我遇到了同样的问题,我解决了它,如下。希望能对你有所帮助。
bmp.Save("test.jpeg", ImageFormat.Bmp);https://stackoverflow.com/questions/4050619
复制相似问题