如何在c#中读取和修改图像的色彩空间

时间:2009-07-06 11:08:14

标签: c# graphics rgb color-space

我正在从jpg文件加载一个位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我正在加载的图像达到巨大(9000 * 9000像素,压缩大小为40-50MB)。怎么办呢?

顺便说一下:如果可能,我不想使用任何外部库。但是如果你知道一个开源实用程序类执行最常见的映像任务,我会很高兴听到它。提前谢谢。

4 个答案:

答案 0 :(得分:2)

jpeg应该以0xFF 0xD8开头。之后,您将找到以下格式的各种字段:

  1. 字段标识符2个字节
  2. 字段长度,不包括字段标识符。 2个字节。
  3. 可变数据。
  4. 解析田野。您要查找的标识符是0xFF 0xC0。这称为SOF0,包含高度,宽度,位深度等。对于字段长度,0xFF 0xC0后面跟着两个字节。紧随其后的是一个字节,显示位深度,通常为8.然后高度为两个字节,宽度为2个,组件数量为单个字节;这通常是1(灰度)或3.(颜色)

答案 1 :(得分:0)

这不是我自己尝试过的,但我认为您可能需要将图片的EXIF信息作为开头。

查看Scott Hanselman的博客文章on accessing EXIF information from pictures

答案 2 :(得分:0)

标准.NET System.Drawing命名空间应该具有您需要的所有功能, 但它可能效率不高。它会将整个内容加载到RAM中,解压缩,转换(可能通过制作副本),然后重新压缩并保存。如果您的目标是高性能,我担心您可能需要查看C / C ++库并为它们制作.NET包装。

答案 3 :(得分:0)

据我所知,jpg总是24 bpp。唯一可以改变的是它是CMY(K?)而不是RGB。该信息将存储在标题中。不幸的是,我没有办法创建一个CMYK图像来测试加载到Bitmap是否会自动转换它。

以下行将文件读入内存:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat会告诉您图片格式。但是,我无法测试文件加载对24bpp RGB jpgs以外的文件的影响。我只能建议您尝试一下。