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