首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用较低的位深度(例如24到16 )保存jpg (C#)

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

Stack Overflow用户
提问于 2010-10-29 17:32:53
回答 3查看 10K关注 0票数 2

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

代码语言:javascript
运行
复制
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;
}

你知道哪里出问题了吗?

谢谢,弗兰克

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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这样的东西。

票数 3
EN

Stack Overflow用户

发布于 2014-08-26 22:43:14

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

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

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

代码语言:javascript
运行
复制
convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg
票数 2
EN

Stack Overflow用户

发布于 2018-07-20 18:48:07

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

代码语言:javascript
运行
复制
bmp.Save("test.jpeg", ImageFormat.Bmp);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4050619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档