使用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資料庫
- 如何用Python讀取xml檔案後,裁剪標註圖片和擴容資料PythonXML
- Python如何讀取pdf中的圖片Python
- Java 讀取PDF中的文字和圖片Java
- python opencv讀取網路圖片PythonOpenCV
- 如何在 Spartacus 使用 UserAccountFacade 在語言設定更改後重新讀取使用者資料
- 使用 jQuery 讀取 Vue 元件的資料jQueryVue元件
- 爬取微博圖片資料存到Mysql中遇到的各種坑mysql儲存圖片爬取微博圖片MySql
- Unity從圖片的位元組資料裡面獲取圖片的寬和高Unity
- python讀取txt文字資料進行分詞並生成詞雲圖片Python分詞
- MATLAB讀取圖片遇到長寬的問題Matlab
- Java 讀取Word表格中的文字和圖片Java
- 03 #### 讀取靜態檔案-圖片
- 使用yaml檔案讀取資料YAML
- Excel 讀取圖片並獲取儲存路徑Excel
- (IOS)根據bundle中的檔名讀取圖片iOS
- Java 讀取Word文字框中的文字/圖片/表格Java
- C++讀取一個png圖片資訊-[lenna.png]C++
- phpSpreadsheet 讀取圖片並另存為檔案PHP
- 使用 JavaScript Promise 讀取 Github 某使用者的資料JavaScriptPromiseGithub
- pandas讀取csv檔案資料並使用matplotlib畫折線圖和餅圖
- 關於瀏覽器快取問題(圖片更換後,頁面仍優先讀取快取)瀏覽器快取
- 將任意bmp圖片大小重新設定後生成新的bmp圖片
- Blazor Hybrid (Blazor混合開發)更好的讀取本地圖片Blazor地圖
- Python資料爬蟲學習筆記(11)爬取千圖網圖片資料Python爬蟲筆記
- MATLAB學習之gif圖片讀取顯示Matlab
- FileReader()讀取檔案、圖片上傳預覽
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- spark讀取hbase的資料Spark
- Jmeter 從 CSV 中讀取的資料後多了一個空格JMeter
- 使用openpyxl庫讀取Excel檔案資料Excel
- 使用ColorfulImg獲取圖片主題色!
- 讀取JSON資料JSON
- 讀取CSV資料
- python--字串格式化用於批量讀取圖片Python字串格式化
- cv2.imread不能正常讀取gif格式圖片