2

我正在从 jpg 文件加载位图。如果图像不是 24 位 RGB,我想转换它。转换应该相当快。我正在加载的图像非常大(9000*9000 像素,压缩大小为 40-50MB)。如何才能做到这一点?

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

4

4 回答 4

2

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

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

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

于 2009-07-06T15:17:24.413 回答
0

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

查看 Scott Hanselman关于从图片访问 EXIF 信息的博客条目。

于 2009-07-06T11:33:46.330 回答
0

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

于 2009-07-06T11:44:10.130 回答
0

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

以下行会将文件读入内存:

Bitmap image = Image.FromFile(fileName);

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

于 2009-07-06T11:46:49.423 回答