生活随笔
收集整理的這篇文章主要介紹了
Java修改图片元数据Exif信息
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近項目里面涉及到了圖片的元數(shù)據(jù)修改,這里把詳細的內(nèi)容給大家分享一下
項目用到了兩個Jar包,分別是 mediautil-1.0.jar,metadata-extractor-2.3.1.jar。
重點是mediautil這個jar包,附上它的官方鏈接:http://mediachest.sourceforge.net/mediautil/,里面有一些它的官方示例,有一點需要注意的是,官網(wǎng)有一個更新補丁,我們需要將補丁包下載解壓縮之后放入我們的項目
后續(xù)在進行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.*;
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);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
);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
);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
);e
= new Entry(Exif.ASCII
);e
.setValue(0, "0230");exifOffSetId
.setEntry(Exif.EXIFVERSION
, 0, e
);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
);}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(); 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];
IFD exifOffSetId
= mainIfd
.getIFD(Exif.EXIFOFFSET
);
IFD gpsIfd
= mainIfd
.getIFD(Exif.GPSINFO
);
上面是一些基本的屬性,它的Hex分別一一對應Exif.java里面的靜態(tài)變量
比如相機型號Model:下面是Exif.java對應的變量
public final static int MODEL
= 0x110;
圖片里是相機型號在元數(shù)據(jù)里的對照信息,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信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。