2009-07-06 33 views
2

我正在从jpg文件加载位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我正在加载的图像最大(9000 * 9000像素,压缩尺寸为40-50MB)。如何才能做到这一点?如何读取和修改c中图像的颜色空间#

btw:如果可能,我不想使用任何外部库。但是如果您知道执行最常见映像任务的开源工具类,我很乐意听到它。提前致谢。

回答

2

jpeg应该以0xFF 0xD8开头。之后,你会发现在格式各个领域:

  1. 字段标识符2个字节
  2. 字段长度,不包括字段标识符。 2个字节。
  3. 变量数据。

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

0

这不是我自己试过的东西,但我认为你可能需要将图片的EXIF信息作为开始。

查看Scott Hanselman的博客条目on accessing EXIF information from pictures

+1

Exif-Data只是与图像关联的普通可选元数据。修改Exif-Data不会更改图像上的任何内容。但无论如何感谢您的答案。 – Mats 2009-07-06 11:36:49

0

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

0

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

下面一行将文件读入到内存:

Bitmap image = Image.FromFile(fileName); 

image.PixelFormat会告诉你的图像格式。但是,我无法测试文件加载对除24bpp RGB jpgs以外的文件所做的操作。我只能建议你尝试一下。

+0

我相信,那个jpg可以在24位和8位深度,这是一个灰度图像。 – Mats 2009-07-06 11:52:23