最近在做一个图片上传的问题,由于图片上传前需要对图片进行压缩处理,图片的原始信息自然被处理掉了。但是需求是在电脑端能看到图片的详细信息。由于之前使用过Exifinterface,对其还有一些信心搞定,但在实际使用中才发现Exifinterface属性的修改并没有用。
接下来就是一顿网上找,各种找都是比较麻烦的方法,还各种冲突。最后找到了JHeader这个包,说真的很好用,当即就成功了。
送一张直达的飞机票
当我正在以为成功后将代码copy到项目中,发现信息写不进去。原因是:
Attempt to invoke virtual method ‘java.util.SortedMap net.sourceforge.jheader.App1Header.getTags()’ on a null object reference
最后打印结果是App1Header exifHeader = jpegHeaders.getApp1Header();这个方法获取的exifheader为null。什么原因呢,大概是由于项目中的图片是压缩图片,没有exif信息,所以报异常。而我测试的时候使用的图片是相册中选取的图片,包含了丰富的exif信息。于是重新测试,直接从手机截屏的图片测试,结果出现了同样的结果,null异常。
最后没办法了,示列代码不行,也没有文档。发现了有两个方法:
JpegHeaders.preheat();//准备
jpegHeaders.convertToExif();//转换
加入这两行代码后成功了。
最后奉上jar文件地址:
下载地址
代码段:
package com.example.telephone;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import net.sourceforge.jheader.App1Header;
import net.sourceforge.jheader.App1Header.Tag;
import net.sourceforge.jheader.JpegHeaders;
import android.util.Log;
public class JpegHeaderExif_tag {
public static void test(File imagePath){
try {
JpegHeaders jpegHeaders = new JpegHeaders(imagePath.getAbsolutePath());
JpegHeaders.preheat();
jpegHeaders.convertToExif();
App1Header exifHeader = jpegHeaders.getApp1Header();
// 遍历显示EXIF
SortedMap tags = exifHeader.getTags();
// 修改EXIF
Tag[] values = Tag.values();
List list = new ArrayList();
for (int i = 0; i < values.length; i++) {
list.add(values[i].toString());
}
Log.e("tag", "--" + tags);
exifHeader.setValue(Tag.DATETIMEORIGINAL, "2015:08:25 05:55:55");
exifHeader.setValue(Tag.ORIENTATION, "1"); // 浏览模式/方向:上/左
exifHeader.setValue(Tag.APERTUREVALUE, "11/5"); // 光圈:2.2
exifHeader.setValue(Tag.FOCALLENGTH, "7/2"); // 焦距:3.5mm
exifHeader.setValue(Tag.WHITEBALANCE, "0"); // 白平衡:0-自动
exifHeader.setValue(Tag.ISOSPEEDRATINGS, "69"); // ISO感光度:100
// exifHeader.setValue(Tag.EXPOSURETIME, valueExposure); // 曝光时间:1/30
// 曝光补偿:EV值每增加1.0,相当于摄入的光线量增加一倍,如果照片过亮,要减小EV值,EV值每减小1.0,相当于摄入的光线量减小一倍
// exifHeader.setValue(Tag.EXPOSUREBIASVALUE, valueExposureBias);
// exifHeader.setValue(Tag.METERINGMODE, valueMeteringMode); // 测光模式:1-平均
// exifHeader.setValue(Tag.SATURATION,valueSaturation); // 饱和度
exifHeader.setValue(Tag.FLASH, "0"); // 闪光灯:未使用
// 保存,参数:是否保存原文件为.old
jpegHeaders.save(false);
} catch (Exception e) {
Log.e("tag", "插入失败--" + e.getMessage());
e.printStackTrace();
}
}
// [所有标签
// UNKNOWN,
// IMAGEDESCRIPTION,
// MAKE,
// MODEL,
// ORIENTATION,
// XRESOLUTION,
// YRESOLUTION,
// RESOLUTIONUNIT,
// SOFTWARE,
//1 DATETIME,
// WHITEPOINT,
// PRIMARYCHROMATICITIES,
// YCBCRCOEFFICIENTS,
// YCBCRPOSITIONING,
// REFERENCEBLACKWHITE,
// COPYRIGHT,
// EXIFOFFSET,
// NEWSUBFILETYPE,
// SUBFILETYPE,
// TRANSFERFUNCTION,
// ARTIST,
// PREDICTOR,
// TILEWIDTH,
// TILELENGTH,
// TILEOFFSETS,
// TILEBYTECOUNTS,
// SUBIFDS,
// JPEGTABLES,
// CFAREPEATPATTERNDIM,
// CFAPATTERN,
// BATTERYLEVEL,
// IPTCNAA,
// INTERCOLORPROFILE,
// SPECTRALSENSITIVITY,
// GPSINFO,
// OECF,
// INTERLACE,
// TIMEZONEOFFSET,
// SELFTIMERMODE,
// FLASHENERGY,
// SPATIALFREQUENCYRESPONSE,
// NOISE,
// IMAGENUMBER,
// SECURITYCLASSIFICATION,
// IMAGEHISTORY,
// SUBJECTLOCATION,
// EXPOSUREINDEX2,
// TIFFEPSTANDARDID,
// FLASHENERGY2,
// SPATIALFREQUENCYRESPONSE2,
// SUBJECTLOCATION2,
// EXPOSURETIME,
// FNUMBER,
// EXPOSUREPROGRAM,
// ISOSPEEDRATINGS,
// EXIFVERSION,
//2 DATETIMEORIGINAL,
//3 DATETIMEDIGITIZED,
// COMPONENTSCONFIGURATION,
// COMPRESSEDBITSPERPIXEL,
// SHUTTERSPEEDVALUE,
// APERTUREVALUE,
// BRIGHTNESSVALUE,
// EXPOSUREBIASVALUE,
// MAXAPERTUREVALUE,
// SUBJECTDISTANCE,
// METERINGMODE,
// LIGHTSOURCE,
// FLASH,
// FOCALLENGTH,
// MAKERNOTE,
// USERCOMMENT,
// SUBSECTIME,
// SUBSECTIMEORIGINAL,
// SUBSECTIMEDIGITIZED,
// FLASHPIXVERSION,
// COLORSPACE,
// EXIFIMAGEWIDTH,
// EXIFIMAGEHEIGHT,
// RELATEDSOUNDFILE,
// EXIFINTEROPERABILITYOFFSET,
// FOCALPLANEXRESOLUTION,
// FOCALPLANEYRESOLUTION,
// FOCALPLANERESOLUTIONUNIT,
// EXPOSUREINDEX,
// SENSINGMETHOD,
// FILESOURCE,
// SCENETYPE,
// CFAPATTERN_HRPT,
// CFAPATTERN_VRPT,
// CFAPATTERN_VALUETL,
// CFAPATTERN_VALUETR,
// CFAPATTERN_VALUEBL,
// CFAPATTERN_VALUEBR,
// CUSTOMRENDERED,
// EXPOSUREMODE,
// WHITEBALANCE,
// DIGITALZOOM,
// FOCALLENGTH35MM,
// SCENECAPTURETYPE,
// GAINCONTROL,
// CONTRAST,
// SATURATION,
// SHARPNESS,
// DEVICESETTINGDESCRIPTION,
// SUBJECTDISTANCERANGE,
// INTEROPERABILITYINDEX,
// INTEROPERABILITYVERSION,
// RELATEDIMAGEFILEFORMAT,
// RELATEDIMAGEWIDTH,
// RELATEDIMAGELENGTH,
// IFD1_IMAGEWIDTH,
// IFD1_IMAGELENGTH,
// IFD1_BITSPERSAMPLE,
// IFD1_COMPRESSION,
// IFD1_PHOTOMETRICINTERPRETATION,
// IFD1_MAKE,
// IFD1_MODEL,
// IFD1_STRIPOFFSETS,
// IFD1_ORIENTATION,
// IFD1_SAMPLESPERPIXEL,
// IFD1_ROWSPERSTRIP,
// IFD1_STRIPBYTECONUNTS,
// IFD1_XRESOLUTION,
// IFD1_YRESOLUTION,
// IFD1_PLANARCONFIGURATION,
// IFD1_RESOLUTIONUNIT,
//4 IFD1_DATETIME,
// IFD1_JPEGIFOFFSET,
// IFD1_JPEGIFBYTECOUNT,
// IFD1_YCBCRCOEFFICIENTS,
// IFD1_YCBCRSUBSAMPLING,
// IFD1_YCBCRPOSITIONING,
// IFD1_REFERENCEBLACKWHITE,
// OLYMPUS_SPECIALMODE,
// OLYMPUS_JPEGQUAL,
// OLYMPUS_MACRO,
// OLYMPUS_UNKNOWN1,
// OLYMPUS_DIGIZOOM,
// OLYMPUS_UNKNOWN2,
// OLYMPUS_UNKNOWN3,
// OLYMPUS_SOFTWARERELEASE,
// OLYMPUS_PICTINFO,
// OLYMPUS_CAMERAID,
// OLYMPUS_DATADUMP,
// NIKON_UNKNOWN1,
// NIKON_QUALITY,
// NIKON_COLORMODE,
// NIKON_IMAGEADJUSTMENT,
// NIKON_CCDSENSITIVITY,
// NIKON_WHITEBALANCE,
// NIKON_FOCUS,
// NIKON_UNKNOWN2,
// NIKON_DIGITALZOOM,
// NIKON_CONVERTER,
// NIKON_UNKNOWN3,
// NIKOND1_UNKNOWN1,
// NIKOND1_ISOSETTING,
// NIKOND1_COLORMODE,
// NIKOND1_QUALITY,
// NIKOND1_WHITEBALANCE,
// NIKOND1_IMAGESHARPENING,
// NIKOND1_FOCUSMODE,
// NIKOND1_FLASHSETTING,
// NIKOND1_UNKNOWN2,
// NIKOND1_ISOSELECTION,
// NIKOND1_IMAGEADJUSTMENT,
// NIKOND1_ADAPTER,
// NIKOND1_MANUALFOCUSDISTANCE,
// NIKOND1_DIGITALZOOM,
// NIKOND1_AFFOCUSPOSITION,
// NIKOND1_DATADUMP,
// CASIO_RECORDINGMODE,
// CASIO_QUALITY,
// CASIO_FOCUSINGMODE,
// CASIO_FLASHMODE,
// CASIO_FLASHINTENSITY,
// CASIO_OBJECTDISTANCE,
// CASIO_WHITEBALANCE,
// CASIO_UNKNOWN1,
// CASIO_UNKNOWN2,
// CASIO_DIGITALZOOM,
// CASIO_SHARPNESS,
// CASIO_CONTRAST,
// CASIO_SATURATION,
// CASIO_UNKNOWN3,
// CASIO_UNKNOWN4,
// CASIO_UNKNOWN5,
// CASIO_UNKNOWN6,
// CASIO_UNKNOWN7,
// CASIO_UNKNOWN8,
// CASIO_CCDSENSITIVITY,
// CASIO2_PREVIEWTHUMBNAILDIMENSIONS,
// CASIO2_PREVIEWTHUMBNAILSIZE,
// CASIO2_PREVIEWTHUMBNAILOFFSET,
// CASIO2_QUALITYMODE,
// CASIO2_IMAGESIZE,
// CASIO2_FOCUSMODE,
// CASIO2_ISOSENSITIVITY,
// CASIO2_WHITEBALANCE,
// CASIO2_FOCALLENGTH,
// CASIO2_SATURATION,
// CASIO2_CONTRAST,
// CASIO2_SHARPNESS,
// CASIO2_PIM,
// CASIO2_CASIOPREVIEWTHUMBNAIL,
// CASIO2_WHITEBALANCEBIAS,
// CASIO2_WHITEBALANCE2,
// CASIO2_OBJECTDISTANCE,
// CASIO2_FLASHDISTANCE,
// CASIO2_RECORDMODE,
// CASIO2_SELTIMER,
// CASIO2_QUALITY,
// CASIO2_FOCUSMODE2,
// CASIO2_TIMEZONE,
// CASIO2_BESTSHOTMODE,
// CASIO2_CCDISOSENSITIVITY,
// CASIO2_COLORMODE,
// CASIO2_ENHANCEMENT,
// CASIO2_FILTER,
// CANON_UNKNOWN1,
// CANON_MACROMODE,
// CANON_SELFTIMERLENGTH,
// CANON_UNKNOWN3,
// CANON_FLASHMODE,
// CANON_CONTINUOUSDRIVEMODE,
// CANON_UNKNOWN4,
// CANON_FOCUSMODE,
// CANON_UNKNO
}