所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据。
本文介绍如何使用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的原创文章,请关注公众号"汪子熙":
相关推荐
OCR(Optical Character Recognition,光学字符识别)技术是将图像中的文本转换为机器可读格式的关键工具,而`com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam`则是Java中处理TIFF图像格式时的一个关键类,...
标题中的“tesseract识别中文的com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam.rar”指出这是一个与Tesseract OCR相关的压缩包,包含了用于处理中文的资源和参数,特别是与TIFF图像格式有关的写入参数。...
主页: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 ...
`ImageIO.read()`方法主要用于从各种输入流中读取图像数据,返回一个`BufferedImage`对象,该对象可以用来进一步处理图像。其基本语法如下: ```java public static BufferedImage read(InputStream input) throws ...
另外,该库还提供了元数据处理,可以读取和保存图像文件的元数据,这对于需要保留原始信息的图像处理应用尤其重要。 在实际应用中,TwelveMonkeys ImageIO的集成非常简单。开发者只需在项目中添加相应的依赖,就...
1. **读取图像**:使用`javax.imageio.ImageIO.read()`方法,可以读取各种支持的图像格式,如JPEG、PNG等,添加WebP插件后,也可以读取WebP格式。 2. **写入图像**:`javax.imageio.ImageIO.write()`方法用于将...
赠送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, java处理图片的库。 从maven中央仓库下载的。实测可用。
赠送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; 包含...
1. **读取 WebP 图像**:通过 ImageIO.read() 方法,可以像读取其他格式的图像一样读取 WebP 图像,无需关心底层的解码过程。 2. **写入 WebP 图像**:利用 ImageIO.write() 方法,将 Java 中的 BufferedImage 对象...
在Java编程环境中,图片处理是一项常见的任务,但有时可能会遇到“javax.imageio.IIOException: Unsupported Image Type”的错误。这个异常通常表示Java的`ImageIO`类库无法识别或支持所尝试读取或写入的图像格式。...
例如,可以使用`jai_core`进行图像的几何变换,用`jai_imageio`来读取和保存不同格式的图像,而`jai_codec`则负责图像数据的压缩和解压缩。 在实际应用中,JAI特别适用于需要高性能图像处理的场景,如医疗成像、...
java高级图片处理工具 jai-imageio,可以修改图片分辨率等
一个可以支持通过Java进行图片转换的jar包,封装好了跨平台动态链接库调用支持。https://link.zhihu.com/?target=https%3A//github.com/nintha/webp-imageio-core
赠送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
赠送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文档:...
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
在这个例子中,`ImageIO.read()`方法能够正确识别并读取CMYK模式的JPEG图片,而无需任何额外的配置或代码。 通过分享这个rar压缩包,我们可以看出开发者在寻找适用于CMYK模式的Java图像处理解决方案时遇到了困难,...
1. 图像读写:imageio提供了一种简洁的API,例如`imageio.imread()`和`imageio.imwrite()`,用于读取和写入图像文件,支持多种格式。 2. 动画处理:除了静态图像,imageio还可以处理GIF、视频等动态内容,`imageio....