`
JerryWang_SAP
  • 浏览: 1044105 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据

阅读更多

所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据。

本文介绍如何使用Java代码将一张图片的隐藏信息读取出来。

首先不需要下载任何额外的Java库,用JDK自带的库就能工作。

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.imageio.ImageReader;

import javax.imageio.metadata.IIOMetadata;

import javax.imageio.metadata.IIOMetadataNode;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sun.imageio.plugins.png.PNGMetadata;

新建一个Java类,这个类的main方法也是非常直接的:

static public void main(String[] arg) throws IOException{

byte[] content = getContent("C:\Users\i042416\Desktop\test\clipboard1.png");

readCustomData(content);

}

首先把桌面上名叫clipboard1.png的图片文件的内容读到字节数组content中。

getContent方法的代码:

 

一张png图片的元数据,散布在下面这些节点里:

printNode(pngmeta.getStandardChromaNode());

printNode(pngmeta.getStandardCompressionNode());

printNode(pngmeta.getStandardDataNode());

printNode(pngmeta.getStandardDimensionNode());

printNode(pngmeta.getStandardDocumentNode());

printNode(pngmeta.getStandardTextNode());

printNode(pngmeta.getStandardTransparencyNode());

通过printNode打印出来:

 

printNode方法的源代码:

 

打印出来的元数据:

 

如果大家想要复制粘贴,这是全部的源代码:

package image;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.imageio.ImageReader;

import javax.imageio.metadata.IIOMetadata;

import javax.imageio.metadata.IIOMetadataNode;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sun.imageio.plugins.png.PNGMetadata;

public class pngTest {

static private byte[] getContent(String filePath) throws IOException {

File file = new File(filePath);

long fileSize = file.length();

if (fileSize > Integer.MAX_VALUE) {

System.out.println("file too big...");

return null;

}

FileInputStream fi = new FileInputStream(file);

byte[] buffer = new byte[(int) fileSize];

int offset = 0;

int numRead = 0;

while (offset < buffer.length

&& (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {

offset += numRead;

}

if (offset != buffer.length) {

fi.close();

throw new IOException("Could not completely read file "

+ file.getName());

}

fi.close();

return buffer;

}

static private void readCustomData(byte[] imageData) throws IOException{

ImageReader imageReader = ImageIO.getImageReadersByFormatName("png").next();

imageReader.setInput(ImageIO.createImageInputStream(new ByteArrayInputStream(imageData)), true);

IIOMetadata metadata = imageReader.getImageMetadata(0);

PNGMetadata pngmeta = (PNGMetadata) metadata;

printNode(pngmeta.getStandardChromaNode());

printNode(pngmeta.getStandardCompressionNode());

printNode(pngmeta.getStandardDataNode());

printNode(pngmeta.getStandardDimensionNode());

printNode(pngmeta.getStandardDocumentNode());

printNode(pngmeta.getStandardTextNode());

printNode(pngmeta.getStandardTransparencyNode());

}

static private void printNode(IIOMetadataNode metanode){

if (metanode == null)

return;

NodeList childNodes = metanode.getChildNodes();

if( childNodes == null)

return;

for (int i = 0; i < childNodes.getLength(); i++) {

Node node = childNodes.item(i);

NamedNodeMap attribute = node.getAttributes();

if( attribute == null)

continue;

int length = attribute.getLength();

for( int j = 0; j < length; j++){

Node each = attribute.item(j);

String value = each.getNodeValue();

String name = each.getNodeName();

System.out.println("Name: " + name + " value: " + value);

}

}

}

static public void main(String[] arg) throws IOException{

byte[] content = getContent("C:\Users\i042416\Desktop\test\clipboard1.png");

readCustomData(content);

}

}

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

 
0
0
分享到:
评论

相关推荐

    tesseract识别中文的com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam下载

    OCR(Optical Character Recognition,光学字符识别)技术是将图像中的文本转换为机器可读格式的关键工具,而`com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam`则是Java中处理TIFF图像格式时的一个关键类,...

    tesseract识别中文的com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam.rar

    标题中的“tesseract识别中文的com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam.rar”指出这是一个与Tesseract OCR相关的压缩包,包含了用于处理中文的资源和参数,特别是与TIFF图像格式有关的写入参数。...

    com.sun.media.jai等文件转换jar

    主页:http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html JAI 中的 Image I/O Tools,支持更多图片类型,例如JPEG-LS, JPEG2000, 和 TIFF。 主页:https://jai-imageio.dev.java.net/。JAI ...

    Java图片处理ImageIO.read()问题

    `ImageIO.read()`方法主要用于从各种输入流中读取图像数据,返回一个`BufferedImage`对象,该对象可以用来进一步处理图像。其基本语法如下: ```java public static BufferedImage read(InputStream input) throws ...

    TwelveMonkeysImageIO:JavaImageIO的一个插件和扩展集合

    另外,该库还提供了元数据处理,可以读取和保存图像文件的元数据,这对于需要保留原始信息的图像处理应用尤其重要。 在实际应用中,TwelveMonkeys ImageIO的集成非常简单。开发者只需在项目中添加相应的依赖,就...

    webp-imageio-10.和1.6(不要积分)

    1. **读取图像**:使用`javax.imageio.ImageIO.read()`方法,可以读取各种支持的图像格式,如JPEG、PNG等,添加WebP插件后,也可以读取WebP格式。 2. **写入图像**:`javax.imageio.ImageIO.write()`方法用于将...

    jai-imageio-core-1.4.0-API文档-中文版.zip

    赠送jar包:jai-imageio-core-1.4.0.jar; 赠送原API文档:jai-imageio-core-1.4.0-javadoc.jar; 赠送源代码:jai-imageio-core-1.4.0-sources.jar; 赠送Maven依赖信息文件:jai-imageio-core-1.4.0.pom; 包含...

    javax.imageio-1.0.5.jar

    javax.imageio-1.0.5.jar, java处理图片的库。 从maven中央仓库下载的。实测可用。

    jai-imageio-core-1.4.0-API文档-中英对照版.zip

    赠送jar包:jai-imageio-core-1.4.0.jar; 赠送原API文档:jai-imageio-core-1.4.0-javadoc.jar; 赠送源代码:jai-imageio-core-1.4.0-sources.jar; 赠送Maven依赖信息文件:jai-imageio-core-1.4.0.pom; 包含...

    webp-imageio-0.4.2.zip

    1. **读取 WebP 图像**:通过 ImageIO.read() 方法,可以像读取其他格式的图像一样读取 WebP 图像,无需关心底层的解码过程。 2. **写入 WebP 图像**:利用 ImageIO.write() 方法,将 Java 中的 BufferedImage 对象...

    图片处理 javax.imageio.IIOException: Unsupported Image Type

    在Java编程环境中,图片处理是一项常见的任务,但有时可能会遇到“javax.imageio.IIOException: Unsupported Image Type”的错误。这个异常通常表示Java的`ImageIO`类库无法识别或支持所尝试读取或写入的图像格式。...

    jai-core-1.1.3.jar jai-imageio.jar jai-codec-1.1.3.jar

    例如,可以使用`jai_core`进行图像的几何变换,用`jai_imageio`来读取和保存不同格式的图像,而`jai_codec`则负责图像数据的压缩和解压缩。 在实际应用中,JAI特别适用于需要高性能图像处理的场景,如医疗成像、...

    jai_imageio.jar

    java高级图片处理工具 jai-imageio,可以修改图片分辨率等

    webp-imageio-core-0.1.3.jar

    一个可以支持通过Java进行图片转换的jar包,封装好了跨平台动态链接库调用支持。https://link.zhihu.com/?target=https%3A//github.com/nintha/webp-imageio-core

    imageio-core-3.1.1-API文档-中文版.zip

    赠送jar包:imageio-core-3.1.1.jar; 赠送原API文档:imageio-core-3.1.1-javadoc.jar; 赠送源代码:imageio-core-3.1.1-sources.jar; 赠送Maven依赖信息文件:imageio-core-3.1.1.pom; 包含翻译后的API文档:...

    jai_codec-1.1.3.jar jai_core.jar jai_imageio.jar jimi-1.0.jar

    jai_codec-1.1.3.jar jai_core.jar jai_imageio.jar jimi-1.0.jar

    imageio-psd-3.1.1-API文档-中文版.zip

    赠送jar包:imageio-psd-3.1.1.jar; 赠送原API文档:imageio-psd-3.1.1-javadoc.jar; 赠送源代码:imageio-psd-3.1.1-sources.jar; 赠送Maven依赖信息文件:imageio-psd-3.1.1.pom; 包含翻译后的API文档:...

    webp-imageio built for x64

    java环境下生成webp文件所用到的库,libwebp-imageio.so for Linux,webp-imageio.dll for Windows,webp-imageio-1.0.0.jar for java project。项目文件:https://bitbucket.org/luciad/webp-imageio

    twelvemonkeys相关jar包.rar

    在这个例子中,`ImageIO.read()`方法能够正确识别并读取CMYK模式的JPEG图片,而无需任何额外的配置或代码。 通过分享这个rar压缩包,我们可以看出开发者在寻找适用于CMYK模式的Java图像处理解决方案时遇到了困难,...

    imageio-2.5.0.tar.gz

    1. 图像读写:imageio提供了一种简洁的API,例如`imageio.imread()`和`imageio.imwrite()`,用于读取和写入图像文件,支持多种格式。 2. 动画处理:除了静态图像,imageio还可以处理GIF、视频等动态内容,`imageio....

Global site tag (gtag.js) - Google Analytics