日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java修改图片元数据Exif信息

發布時間:2023/12/18 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java修改图片元数据Exif信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近項目里面涉及到了圖片的元數據修改,這里把詳細的內容給大家分享一下
項目用到了兩個Jar包,分別是 mediautil-1.0.jar,metadata-extractor-2.3.1.jar。
重點是mediautil這個jar包,附上它的官方鏈接:http://mediachest.sourceforge.net/mediautil/,里面有一些它的官方示例,有一點需要注意的是,官網有一個更新補丁,我們需要將補丁包下載解壓縮之后放入我們的項目
后續在進行EXIF信息修改的java類中引用剛剛解壓好的文件。
下面附上一段完整的修改圖片EXif信息代碼

package com.test;import mediautil.gen.Rational; import mediautil.image.jpeg.Entry; import mediautil.image.jpeg.Exif; import mediautil.image.jpeg.IFD; import mediautil.image.jpeg.LLJTran;import java.io.*;/*** 重寫照片EXIF信息** @author gzy* 2022.05.20*/ public class Test {public static void main(String[] args) throws Exception {main1();}public static void main1() throws Exception {InputStream fip = new FileInputStream("C:\\1.jpg");LLJTran llj = new LLJTran(fip);llj.read(LLJTran.READ_INFO, true);//這里是重點,網上很多人出現 mediautil.image.jpeg.JPEG cannot be cast to mediautil.image.jpeg.Exif 這個錯誤,原因是這張圖片沒有Exif頭,需要給他初始化一個if (!(llj.getImageInfo() instanceof Exif)) {llj.addAppx(LLJTran.dummyExifHeader, 0,LLJTran.dummyExifHeader.length, true);}Exif exif = (Exif) llj.getImageInfo();//獲取基礎標簽IFD mainIfd = exif.getIFDs()[0];//設置相機制造商Entry e = new Entry(Exif.ASCII);e.setValue(0, "leica");mainIfd.addEntry(Exif.MAKE, e);//設置相機型號e = new Entry(Exif.ASCII);e.setValue(0, "leica");mainIfd.addEntry(Exif.MODEL, e);//設置描述e = new Entry(Exif.ASCII);e.setValue(0, "xxx");mainIfd.addEntry(Exif.IMAGEDESCRIPTION, e);//版權e = new Entry(Exif.ASCII);e.setValue(0, "xxx");mainIfd.addEntry(Exif.COPYRIGHT, e);//獲取私有標簽IFD exifOffSetId = mainIfd.getIFD(Exif.EXIFOFFSET);if (exifOffSetId == null) {exifOffSetId = new IFD(Exif.EXIFOFFSET, Exif.LONG);mainIfd.addIFD(exifOffSetId);}exifOffSetId.setEntry(Exif.DATETIMEORIGINAL, 0, e);e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(1, 250));exifOffSetId.setEntry(Exif.EXPOSURETIME, 0, e);//修改圖片光圈值e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(16, 14));exifOffSetId.setEntry(Exif.APERTUREVALUE, 0, e);//修改圖片ISO速度e = new Entry(Exif.SHORT);e.setValue(0, 200);exifOffSetId.setEntry(Exif.ISOSPEEDRATINGS, 0, e);//修改圖片焦距e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(50, 1));exifOffSetId.setEntry(Exif.FOCALLENGTH, 0, e);//修改圖片35毫米焦距e = new Entry(Exif.SHORT);e.setValue(0, 50);exifOffSetId.setEntry(Exif.FOCALLENGTHIN35MMFILM, 0, e);//修改目標距離e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(5, 10));exifOffSetId.setEntry(Exif.SUBJECTDISTANCE, 0, e);//修改圖片閃光能量值e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(7800, 1));exifOffSetId.setEntry(Exif.FLASHENERGY, 0, e);//修改圖片亮度e = new Entry(Exif.SHORT);e.setValue(0, 7);exifOffSetId.setEntry(Exif.BRIGHTNESSVALUE, 0, e);//修改圖片光源e = new Entry(Exif.SHORT);e.setValue(0, 0);exifOffSetId.setEntry(Exif.LIGHTSOURCE, 0, e);//修改圖片白平衡e = new Entry(Exif.SHORT);e.setValue(0, 0);exifOffSetId.setEntry(Exif.EXPOSUREMODE, 0, e);//修改圖曝光程序e = new Entry(Exif.SHORT);e.setValue(0, 2);exifOffSetId.setEntry(Exif.EXPOSUREPROGRAM, 0, e);//修改圖清晰度e = new Entry(Exif.SHORT);e.setValue(0, 2);exifOffSetId.setEntry(Exif.SHARPNESS, 0, e);//修改圖像飽和度e = new Entry(Exif.SHORT);e.setValue(0, 0);exifOffSetId.setEntry(Exif.SATURATION, 0, e);//修改圖像對比度e = new Entry(Exif.SHORT);e.setValue(0, 0);exifOffSetId.setEntry(Exif.CONTRAST, 0, e);//修改圖像Exif版本e = new Entry(Exif.ASCII);e.setValue(0, "0230");exifOffSetId.setEntry(Exif.EXIFVERSION, 0, e);//獲取GPS標簽IFD gpsIfd = mainIfd.getIFD(Exif.GPSINFO);if (gpsIfd == null) {System.out.println("Gps IFD not found adding..");gpsIfd = new IFD(Exif.GPSINFO, Exif.LONG);mainIfd.addIFD(gpsIfd);}//修改圖片GPS信息e = new Entry(Exif.ASCII);e.setValue(0, 'N');gpsIfd.setEntry(new Integer(Exif.GPSLatitudeRef), 0, e);e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(45, 1));e.setValue(1, new Rational(39786653, 100000));e.setValue(2, new Rational(0, 1));gpsIfd.setEntry(new Integer(Exif.GPSLatitude), 0, e);e = new Entry(Exif.ASCII);e.setValue(0, 'E');gpsIfd.setEntry(new Integer(Exif.GPSLongitudeRef), 0, e);e = new Entry(Exif.RATIONAL);e.setValue(0, new Rational(87, 1));e.setValue(1, new Rational(116562968, 100000));e.setValue(2, new Rational(0, 1));gpsIfd.setEntry(new Integer(Exif.GPSLongitude), 0, e);llj.refreshAppx(); // Recreate Marker Data for changes done// 改寫后的文件String fileName = "C:\\test5.jpg";OutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));llj.xferInfo(null, out, LLJTran.REPLACE, LLJTran.REPLACE);fip.close();out.close();llj.freeMemory();}}

圖片相關信息修改的對照表附上鏈接 https://www.awaresystems.be/imaging/tiff/tifftags/baseline.html
不同的exif信息是存放在不同的exif tag里面的,所以修改的方式不一樣,具體的所屬標簽可以去對照表里面查看,下面是一些比較常用的標簽獲取代碼,具體的一些其他標簽可以在上面鏈接里面查找

//獲取基本標簽 IFD mainIfd = exif.getIFDs()[0]; //獲取Exif私有標簽 IFD exifOffSetId = mainIfd.getIFD(Exif.EXIFOFFSET); //獲取GPS標簽 IFD gpsIfd = mainIfd.getIFD(Exif.GPSINFO);


上面是一些基本的屬性,它的Hex分別一一對應Exif.java里面的靜態變量
比如相機型號Model:下面是Exif.java對應的變量

/** Identifies the MODEL tag */public final static int MODEL = 0x110;

圖片里是相機型號在元數據里的對照信息,Type是它對應編碼,下面是基本寫法

//獲取基本標簽IFD mainIfd = exif.getIFDs()[0];//設置編碼類型Entry e = new Entry(Exif.ASCII);//設置值e.setValue(0, "leica");//給標簽內容賦值mainIfd.addEntry(Exif.MODEL, e);

具體的圖片信息修改可以參考下貼出來的完整代碼 ,其他的一些Exif讀取,縮略圖修改大家可以去看看MediaUtil的官方示例

總結

以上是生活随笔為你收集整理的Java修改图片元数据Exif信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。