我正在从jpg文件加载位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我正在加载的图像最大(9000 * 9000像素,压缩尺寸为40-50MB)。如何才能做到这一点?如何读取和修改c中图像的颜色空间#
btw:如果可能,我不想使用任何外部库。但是如果您知道执行最常见映像任务的开源工具类,我很乐意听到它。提前致谢。
我正在从jpg文件加载位图。如果图像不是24位RGB,我想转换它。转换应该相当快。我正在加载的图像最大(9000 * 9000像素,压缩尺寸为40-50MB)。如何才能做到这一点?如何读取和修改c中图像的颜色空间#
btw:如果可能,我不想使用任何外部库。但是如果您知道执行最常见映像任务的开源工具类,我很乐意听到它。提前致谢。
jpeg应该以0xFF 0xD8开头。之后,你会发现在格式各个领域:
解析字段。您要查找的标识符是0xFF 0xC0。这称为SOF0,包含高度,宽度,位深度等。0xFF 0xC0后面跟着两个字节的字段长度。紧随其后的是单个字节,显示位深度,通常为8.然后将有两个字节表示高度,两个表示宽度,一个字节表示组件的数量;这通常是1(对于灰度)或3(对于颜色)
这不是我自己试过的东西,但我认为你可能需要将图片的EXIF信息作为开始。
查看Scott Hanselman的博客条目on accessing EXIF information from pictures。
标准.NET System.Drawing
命名空间应该有你需要的所有, 但它可能不会很有效。它会将整个内容加载到RAM中,解压缩,转换(可能通过复制),然后重新压缩并保存。如果您的目标是高性能,恐怕您可能需要查看C/C++库并为它们创建.NET包装器。
据我所知,jpg总是24 bpp。唯一可能改变的是它是CMY(K?)而不是RGB。该信息将存储在标题中。不幸的是,我没有任何创建CMYK图像的方法来测试加载到位图中是否会自动转换它。
下面一行将文件读入到内存:
Bitmap image = Image.FromFile(fileName);
image.PixelFormat
会告诉你的图像格式。但是,我无法测试文件加载对除24bpp RGB jpgs以外的文件所做的操作。我只能建议你尝试一下。
我相信,那个jpg可以在24位和8位深度,这是一个灰度图像。 – Mats 2009-07-06 11:52:23
Exif-Data只是与图像关联的普通可选元数据。修改Exif-Data不会更改图像上的任何内容。但无论如何感谢您的答案。 – Mats 2009-07-06 11:36:49