save jpg with lower bit depth (24 to 16 for instance) (C#)

谁说我不能喝 提交于 2020-01-05 03:31:09

问题


I need to convert 24- and 32-bits jpeg and png-files to a lower bit depth (16). I found some code to do this, but the resulting images keep the bit depth of the original file although there file size is lower.

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;
}

Any ideas what's going wrong?

Thanks, Frank


回答1:


JPEG is a three-color format. It usually has 8 bits per color, but can have 12 or 16. 24=3x8 bits of color is therefore reasonable, but 16 or 32 is simply impossible. It just doesn't divide by three. 3x16=48 would be possible, but that's a higher color depth. JPEG is designed for photo's, and it doesn't make sense to support lower bit depths than 3x8. There's no benefit in that.

Now, what is the 16 bit image in your code? It's an imprecise in-memory approximation of the original, using only 65535 colors. When you save that back, you get a 24 bits JPEG. Apparently your JPEG encoder doesn't know how to create an 48 bits JPEG. Even if it did, it would be a waste of bits since the in-memory image only has 65536 colors anyway.

To summarize: what is going wrong is the task. There's no such thing as a 65536 color JPEG.




回答2:


This question is a bit old, but I will add this for anyone searching in the future.

If it is a 32 bit file, then most likely it is in the CMYK colorspace. This is typically used for printing, but its rare enough that many tools that use RGB and display to screens rather than print can't handle it.

You can convert it to RGB using imagemagic:

convert imageInCMYK.jpg -colorspace RGB imageInRGB.jpg



回答3:


JPEG is a three colors format and it does not allow you to save as 16 bit depth but bmp format does. I encountered the same problem and I solved it as below. Hope it will help you.

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


来源:https://stackoverflow.com/questions/4050619/save-jpg-with-lower-bit-depth-24-to-16-for-instance-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!