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

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

有帮助吗?

解决方案

jpeg 应以 0xFF 0xD8 开头。之后你会发现格式中的各个字段:

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

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

其他提示

这是不是我已经尝试过自己,但我想你可能需要acccess图片的EXIF信息作为开始。

检查一下Scott Hanselman的博客条目上访问EXIF信息的图片的。

标准.NET System.Drawing命名空间应该有你需要的一切, 但它可能不会是非常有效的。它会加载整个事情到RAM,解压缩,将其转换(可能通过复印),然后重新压缩和保存。如果你的目标为高性能,恐怕你可能需要寻找到C / C ++库,使.NET包装他们。

据我知道JPG始终为24 BPP。可能改变的唯一事情是,它的CMY(K?)而不是RGB。这些信息将被存储在头部中。不幸的是我没有创建CMYK图像的任何方式来测试是否装入一个位图会自动转换。

下面的线将文件读入到存储器:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat会告诉你的图像格式。然而,我无法测试文件加载不与除24 bpp的RGB JPG格式的其他文件的内容。我只能建议你尝试一下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top