使用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的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2216519/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在讀取資料時拼接圖片域名
- 讀取本地圖片地圖
- java+pgsql實現儲存圖片到資料庫,以及讀取資料庫儲存的圖片JavaSQL資料庫
- vb向資料庫中讀取單個圖片檔案資料庫
- 如何用Python讀取xml檔案後,裁剪標註圖片和擴容資料PythonXML
- 使用Hibernate和Struts向資料庫中儲存、讀取並顯示圖片資料庫
- 往返讀取後臺資料的代價
- 爬取微博圖片資料存到Mysql中遇到的各種坑mysql儲存圖片爬取微博圖片MySql
- Modbus通用資料讀取工具設計及使用
- c# 圖片檔案讀取C#
- Java 讀取PDF中的文字和圖片Java
- Python如何讀取pdf中的圖片Python
- 使用 jQuery 讀取 Vue 元件的資料jQueryVue元件
- Unity從圖片的位元組資料裡面獲取圖片的寬和高Unity
- jquery使用ajax讀取後臺資料在表格中顯示jQuery
- Java 讀取Word表格中的文字和圖片Java
- python opencv讀取網路圖片PythonOpenCV
- [Android]反射讀取drawable中圖片Android反射
- 03 #### 讀取靜態檔案-圖片
- iOS儲存網路圖片和讀取本地沙盒圖片iOS
- 使用yaml檔案讀取資料YAML
- Excel 讀取圖片並獲取儲存路徑Excel
- python讀取txt文字資料進行分詞並生成詞雲圖片Python分詞
- 如何在 Spartacus 使用 UserAccountFacade 在語言設定更改後重新讀取使用者資料
- 如何限制從資料庫中讀出圖片的大小資料庫
- Java 讀取Word文字框中的文字/圖片/表格Java
- MATLAB讀取圖片遇到長寬的問題Matlab
- (IOS)根據bundle中的檔名讀取圖片iOS
- 使用Excel的VBA來讀取和修改bmp點陣圖畫素資料Excel
- POI 使用SAX讀取大資料Excel大資料Excel
- 關於瀏覽器快取問題(圖片更換後,頁面仍優先讀取快取)瀏覽器快取
- 使用 JavaScript Promise 讀取 Github 某使用者的資料JavaScriptPromiseGithub
- 用VB6讀寫資料庫中的圖片 (轉)資料庫
- 將任意bmp圖片大小重新設定後生成新的bmp圖片
- Python爬取微博資料生成詞雲圖片Python
- 獲取遠端圖片的Blob資源
- Jmeter 從 CSV 中讀取的資料後多了一個空格JMeter
- 使用python把圖片存入資料庫Python資料庫