摘要:所謂圖片元數(shù)據(jù),就是除了我們?nèi)庋劭吹降膱D片內(nèi)容外,隱藏在這些內(nèi)容背后的一些技術(shù)數(shù)據(jù)。本文介紹如何使用代碼將一張圖片的隱藏信息讀取出來。新建一個(gè)類,這個(gè)類的方法也是非常直接的首先把桌面上名叫的圖片文件的內(nèi)容讀到字節(jié)數(shù)組中。
所謂圖片元數(shù)據(jù),就是除了我們?nèi)庋劭吹降膱D片內(nèi)容外,隱藏在這些內(nèi)容背后的一些技術(shù)數(shù)據(jù)。
本文介紹如何使用Java代碼將一張圖片的隱藏信息讀取出來。
首先不需要下載任何額外的Java庫(kù),用JDK自帶的庫(kù)就能工作。
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; 新建一個(gè)Java類,這個(gè)類的main方法也是非常直接的: static public void main(String[] arg) throws IOException{ byte[] content = getContent("C:Usersi042416Desktop estclipboard1.png"); readCustomData(content); }
首先把桌面上名叫clipboard1.png的圖片文件的內(nèi)容讀到字節(jié)數(shù)組content中。
getContent方法的代碼:
一張png圖片的元數(shù)據(jù),散布在下面這些節(jié)點(diǎn)里:
printNode(pngmeta.getStandardChromaNode()); printNode(pngmeta.getStandardCompressionNode()); printNode(pngmeta.getStandardDataNode()); printNode(pngmeta.getStandardDimensionNode()); printNode(pngmeta.getStandardDocumentNode()); printNode(pngmeta.getStandardTextNode()); printNode(pngmeta.getStandardTransparencyNode());
通過printNode打印出來:
printNode方法的源代碼:
打印出來的元數(shù)據(jù):
如果大家想要復(fù)制粘貼,這是全部的源代碼:
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的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71897.html
摘要:摘要導(dǎo)語近日,阿里云發(fā)布了智能媒體管理服務(wù),通過離線處理能力關(guān)聯(lián)授權(quán)的云存儲(chǔ),提供便捷的海量多媒體數(shù)據(jù)一鍵分析,并通過該分析過程構(gòu)建價(jià)值元數(shù)據(jù),更好支撐內(nèi)容檢索。標(biāo)準(zhǔn)統(tǒng)一,訪問接口統(tǒng)一為阿里云的標(biāo)準(zhǔn)。場(chǎng)景化一鍵式處理,提高易用性。 摘要: 導(dǎo)語 近日,阿里云發(fā)布了智能媒體管理(Intelligent Media Management)服務(wù), 通過離線處理能力關(guān)聯(lián)授權(quán)的云存儲(chǔ),提供便捷的...
摘要:轉(zhuǎn)發(fā)通過,將請(qǐng)求通過負(fù)載均衡,均衡給后端處理的服務(wù)。圖床同時(shí)也支持同步上傳回調(diào)通知的方式,將圖片上傳結(jié)果反饋給業(yè)務(wù)方。 Hulk 圖床是支持 360 公司絕大部分業(yè)務(wù)的圖片服務(wù),支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計(jì)算、人臉識(shí)別、格式轉(zhuǎn)換、gif 首幀提取……等等,支持的業(yè)務(wù)線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...
摘要:轉(zhuǎn)發(fā)通過,將請(qǐng)求通過負(fù)載均衡,均衡給后端處理的服務(wù)。圖床同時(shí)也支持同步上傳回調(diào)通知的方式,將圖片上傳結(jié)果反饋給業(yè)務(wù)方。 Hulk 圖床是支持 360 公司絕大部分業(yè)務(wù)的圖片服務(wù),支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計(jì)算、人臉識(shí)別、格式轉(zhuǎn)換、gif 首幀提取……等等,支持的業(yè)務(wù)線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...
閱讀 3526·2021-10-08 10:04
閱讀 871·2019-08-30 15:54
閱讀 2188·2019-08-29 16:09
閱讀 1353·2019-08-29 15:41
閱讀 2284·2019-08-29 11:01
閱讀 1743·2019-08-26 13:51
閱讀 1035·2019-08-26 13:25
閱讀 1834·2019-08-26 13:24