摘要:所謂圖片元數據,就是除了我們肉眼看到的圖片內容外,隱藏在這些內容背后的一些技術數據。本文介紹如何使用代碼將一張圖片的隱藏信息讀取出來。新建一個類,這個類的方法也是非常直接的首先把桌面上名叫的圖片文件的內容讀到字節數組中。
所謂圖片元數據,就是除了我們肉眼看到的圖片內容外,隱藏在這些內容背后的一些技術數據。
本文介紹如何使用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:Usersi042416Desktop estclipboard1.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:Usersi042416Desktop estclipboard1.png"); readCustomData(content); } }
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71897.html
摘要:摘要導語近日,阿里云發布了智能媒體管理服務,通過離線處理能力關聯授權的云存儲,提供便捷的海量多媒體數據一鍵分析,并通過該分析過程構建價值元數據,更好支撐內容檢索。標準統一,訪問接口統一為阿里云的標準。場景化一鍵式處理,提高易用性。 摘要: 導語 近日,阿里云發布了智能媒體管理(Intelligent Media Management)服務, 通過離線處理能力關聯授權的云存儲,提供便捷的...
摘要:轉發通過,將請求通過負載均衡,均衡給后端處理的服務。圖床同時也支持同步上傳回調通知的方式,將圖片上傳結果反饋給業務方。 Hulk 圖床是支持 360 公司絕大部分業務的圖片服務,支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計算、人臉識別、格式轉換、gif 首幀提取……等等,支持的業務線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...
摘要:轉發通過,將請求通過負載均衡,均衡給后端處理的服務。圖床同時也支持同步上傳回調通知的方式,將圖片上傳結果反饋給業務方。 Hulk 圖床是支持 360 公司絕大部分業務的圖片服務,支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計算、人臉識別、格式轉換、gif 首幀提取……等等,支持的業務線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...
閱讀 3513·2021-10-08 10:04
閱讀 863·2019-08-30 15:54
閱讀 2180·2019-08-29 16:09
閱讀 1347·2019-08-29 15:41
閱讀 2272·2019-08-29 11:01
閱讀 1735·2019-08-26 13:51
閱讀 1026·2019-08-26 13:25
閱讀 1806·2019-08-26 13:24