如何在c#中读取和修改图像的色彩空间
-
23-08-2019 - |
题
我正在从 jpg 文件加载位图。如果图像不是 24 位 RGB,我想将其转换。转换应该相当快。我正在加载的图像最大(9000*9000像素,压缩大小为40-50MB)。如何才能做到这一点?
顺便提一句:如果可能的话,我不想使用任何外部库。但如果您知道执行最常见成像任务的开源实用程序类,我会很高兴听到它。提前致谢。
解决方案
jpeg 应以 0xFF 0xD8 开头。之后你会发现格式中的各个字段:
- 字段标识符 2 字节
- 字段长度,不包括字段标识符。2 字节。
- 可变数据。
解析字段。您要查找的标识符是 0xFF 0xC0。这称为 SOF0,包含高度、宽度、位深度等。0xFF 0xC0 后跟两个字节,表示字段长度。紧随其后的是一个显示位深度的单字节,通常为 8。然后将有两个字节表示高度,两个字节表示宽度,还有一个字节表示组件数量;通常为 1(对于灰度)或 3。(对于颜色)
其他提示
这是不是我已经尝试过自己,但我想你可能需要acccess图片的EXIF信息作为开始。
检查一下Scott Hanselman的博客条目上访问EXIF信息的图片的。
标准.NET System.Drawing
命名空间应该有你需要的一切,
但它可能不会是非常有效的。它会加载整个事情到RAM,解压缩,将其转换(可能通过复印),然后重新压缩和保存。如果你的目标为高性能,恐怕你可能需要寻找到C / C ++库,使.NET包装他们。
据我知道JPG始终为24 BPP。可能改变的唯一事情是,它的CMY(K?)而不是RGB。这些信息将被存储在头部中。不幸的是我没有创建CMYK图像的任何方式来测试是否装入一个位图会自动转换。
下面的线将文件读入到存储器:
Bitmap image = Image.FromFile(fileName);
image.PixelFormat
会告诉你的图像格式。然而,我无法测试文件加载不与除24 bpp的RGB JPG格式的其他文件的内容。我只能建议你尝试一下。