【问题标题】:Extracting metadata from PNG image从PNG图像中提取元数据
【发布时间】:2013-01-09 15:44:44
【问题描述】:

我正在尝试从 PNG 图像格式中提取元数据。我正在使用这个库? http://code.google.com/p/metadata-extractor/

尽管它声称支持 PNG 格式,但当我尝试使用 PNG 图像时,我收到错误 File format is not supported。从源代码(在方法readMetadata 中,它看起来也不支持PNG 格式:http://code.google.com/p/metadata-extractor/source/browse/Source/com/drew/imaging/ImageMetadataReader.java?r=1aae00f3fe64388cd14401b2593b580677980884

我也尝试过这段代码,但它也没有提取 PNG 上的元数据。

顺便说一句,我正在使用 imagemagick 在 PNG 上添加元数据,如下所示:

mogrify -comment "Test" Demo/myimage.png

有没有人使用这个库来处理 PNG 格式或有其他方法从 PNG 图像中提取元数据?

【问题讨论】:

标签: java image imagemagick png metadata


【解决方案1】:

你可以试试PNGJ(我是开发者)

参见例如example 转储所有块。 如果您想读取特定的文本块(回想一下,在 PNG 中,每个文本元数据都有一个键和一个值),您可以编写

 pngr.getMetadata().getTxtForKey("mykey")

TweakPNGTweakPNG是一个有用的 Windows 小程序,可以窥视 PNG 块结构。

更新:如果您想检查所有文本块(请记住,这三种类型存在一些差异,但是...)

PngReader pngr = FileHelper.createPngReader(new File(file));
pngr.readSkippingAllRows();
for (PngChunk c : pngr.getChunksList().getChunks()) {
      if (!ChunkHelper.isText(c))   continue;
      PngChunkTextVar ct = (PngChunkTextVar) c;
      String key = ct.getKey();
      String val = ct.getVal();
      // ... 
}

还请记住,允许具有重复键的文本块。

【讨论】:

  • 这太棒了!有没有办法遍历所有的键/值对?我不想使用pngr.getMetadata().getTxtForKey("mykey") 寻找特定的键,而是想遍历图像元数据中的所有键/值对。
  • 太棒了!这样可行。谢谢。只是为了好奇这三种类型是什么?
  • @birdy: libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.Anc-text 基本上: tEXt : 键和值的 Latin1 编码,zTXt:同上,但值是压缩存储的,itTXt:UTF-8 编码
  • 谢谢。我刚刚浏览了您的项目的来源并有一个问题。维基百科说 png 文件的签名以 137 en.wikipedia.org/wiki/Portable_Network_Graphics#File_header 开头但是,在您的源代码中 code.google.com/p/pngj/source/browse/pnjg/src/ar/com/hjg/pngj/… PngHelperInternal 方法 getPngIdSignature 它以 -119 开头。除第一个外,所有其他匹配。为什么会有差异?
  • 因为在 Java 中字节是有符号的。在位级别,它们是相同的数字(137=256-119)
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 2022-08-21
  • 2013-05-14
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多