Android 端读取图片exif信息,并对其进行修改

最近在做一个图片上传的问题,由于图片上传前需要对图片进行压缩处理,图片的原始信息自然被处理掉了。但是需求是在电脑端能看到图片的详细信息。由于之前使用过Exifinterface,对其还有一些信心搞定,但在实际使用中才发现Exifinterface属性的修改并没有用。
接下来就是一顿网上找,各种找都是比较麻烦的方法,还各种冲突。最后找到了JHeader这个包,说真的很好用,当即就成功了。
送一张直达的飞机票

看看处理结果是不是很神奇,直接修改了图片的原始信息:
Android 端读取图片exif信息,并对其进行修改_第1张图片

当我正在以为成功后将代码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
}

你可能感兴趣的:(Android开发,java;,开源项目,移动开发)