【问题标题】:Reading image header info without loading the entire image在不加载整个图像的情况下读取图像标题信息
【发布时间】:2013-01-30 06:45:05
【问题描述】:

我有一个 .net 3.5 应用程序,它将处理大量图像。我需要检查图像扩展名、图像高度和宽度以及 PPI 是否正确。我不想将整个图像加载到 .net 图像或位图中,这将花费很长时间并且会占用大量资源。我不能使用第三方插件或dll,当然需要昨天完成。

所以,我正在读取文件的初始字节,检查“魔术”数字以确保图像扩展名匹配,然后是我需要处理的大多数图像类型的图像高度和宽度。这速度更快,资源消耗更少。我可以使用一些帮助来从某些图像类型中读取 PPI,而到目前为止,其中两种类型让我无法验证扩展。

BMP、JPG、GIF 和 PNG 我在阅读 PPI 时需要帮助。

  • 正在寻找类似位于偏移 xx 处的东西。

TIF、EPS 和 PSD 我需要帮助来阅读高度、宽度和 PPI。

  • 我几乎被 eps 和 Psd 文件困住了,任何事情都会有所帮助。

  • 是的,我知道 tiflib,它看起来很棒,而且远远超出了我的需要。一个只处理高度、宽度和 PPI 的更轻的版本会很棒。如果必须,我可以这样做,但我希望有人准备好了:-)

【问题讨论】:

  • 要确定PPI,对于所有格式来说,它不会像“偏移XX”那么简单。例如,PNG 像素尺寸是可选的 (libpng.org/pub/png/book/chapter11.html#png.ch11.div.8),并且位于一个块中以及其他块中。您必须阅读大块,直到找到 pHYs 一个(如果存在)。其他格式甚至不存储像素尺寸,或者像素尺寸可能不正确(但应用程序未使用,因此它仍然有效)。
  • PPI 也取决于输出显示。使用 PPI 的文件格式通常用于参考原始输出设备。
  • EPS和PSD是复合存储文件。您将无法在特定偏移处找到您要查找的内容。包含的每个图像都可以是位图或矢量图形。任何一种文件类型都可能包含大量图像。
  • @SimonMourier,这将是一个自动过滤器,在人们真正看到照片之前,我们正在努力减少该人看到的“坏”照片的数量。如果数据不正确或不存在,我们将在下一步中捕获它。循环遍历这些块直到我找到我正在寻找的东西或者我点击图像数据是我必须为它看起来像的 PNG 做的事情。
  • @AdamZuckerman,PPI 在几个不同的环境中使用,并且经常被错误地与 DPI 互换。在这种情况下,我正在查看照片,并使用分辨率和像素密度 (PPI) 来评估拍摄时的图像质量。 elizabethhalford.com/editing/pixels-and-dots-the-gameandrewdaceyphotography.com/articles/dpi

标签: .net image header byte


【解决方案1】:

所有字节位置都假定第一个字节在位置 1,而不是 0。

PNG 文件 宽度:字节 9-12,高度:字节 13-16,PPI:查找 112 72 89 115(十进制值)的 4 字节签名,字节 1-4(以下) 包含每单位的 X 像素,字节 5-8 包含每单位的 Y 像素,字节 9 包含单位说明符(0=未知,1=米)。 PPI 存储在一个可选的块中,可能并不存在于所有 PNG 中。

http://www.libpng.org/pub/png/spec/iso/index-object.htmhttp://en.wikipedia.org/wiki/PNG_file_format

BMP 文件 宽度:字节 18-21,高度:字节 22-25,PPI:字节 38-41 包含每米的 X 像素,字节 42-45 包含每米的 Y 像素。

http://en.wikipedia.org/wiki/BMP_file_format

JPG 文件 JPEG 是指压缩,而 JFIF 是实际的文件存储格式。宽度:,高度:,PPI:字节 11-12 包含每单位的 X 像素,字节 13-14 包含每单位的 Y 像素。字节 10 包含单位(0=无单位,1=每英寸像素,2=每厘米像素)。

http://en.wikipedia.org/wiki/JPEG_File_Interchange_Formathttp://www.ecma-international.org/publications/files/ECMA-TR/TR-098.pdf

GIF 文件 宽度:7-8 字节,高度:9-10 字节,PPI:GIF 文件不包含任何像素密度信息。

http://en.wikipedia.org/wiki/Graphics_Interchange_Format

我提供了其他格式的链接,因为它们需要特定的格式知识才能确定您请求的信息是否存储或存储在何处。

http://partners.adobe.com/public/developer/tiff/index.html

http://en.wikipedia.org/wiki/Portable_Document_Formathttp://www.adobe.com/devnet/pdf/pdf_reference_archive.html

http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/

【讨论】:

  • 在我自己的实验中,PNG 宽度为 16(十进制),高度为 20。
【解决方案2】:

与其花费数百小时的开发时间编写和调试您自己的多格式图像解析器,我建议您寻找优化现有方法的方法。虽然有些图像格式很容易,但有些则很难。有些真的很难。如前所述,一些“格式”只是其他格式的容器。

以下是一些建议:

Speed up loading an image from disk in a windows forms (c#.net) app

http://www.vcskicks.com/fast-image-processing.php

How can I find the pixel per inch value in a JPG image?

【讨论】:

  • 正如我在原帖中提到的,加载整个图像以检索有关图像的这三个信息是资源密集型的。当您只需要读取几个字节时,为什么要加载整个 10 或 25Mb 的文件?我们有资源和性能方面的问题,花时间构建它对我的客户来说是值得的。
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2016-12-02
  • 1970-01-01
  • 2010-09-11
  • 2013-02-01
相关资源
最近更新 更多