Android冷门知识。读写图片Exif信息,用到了JHeader jar包

本文详细介绍了Exif信息的概念及其在照片处理、三维建模等场景的应用。通过实例展示了如何使用Java和Android API写入Exif信息,并解释了不同方法的适用场景和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,Exif信息是什么?
也不废话,百度百科说的很清楚:
http://baike.baidu.com/link?url=q7uOXmyvU-3HUGt_FwL7MWGJ_sFWj6qo0HQeCV-mC0F5cYeexpIyAEwAlfkgqp-IjDn2D5oepItgW_dXj3N0OK
我的理解呢Exif信息就是照片被拍摄的时候相机的焦距,物距,曝光值等信息,这信息或许对于我们浏览照片不重要,但要是电脑的一些软件要识别这些照片的时候可能就有要求了,比如,Smart3D三维建模的时候就是对Exif信息是由要求的,没Exif信息生成不了模型。

  private void saveRxif(File file) throws IOException, JpegFormatException {
            //在这里将信息写入图片
            JpegHeaders jpegHeaders = null;
            jpegHeaders = new JpegHeaders(file);
            jpegHeaders.convertToExif();
            App1Header app1Header = jpegHeaders.getApp1Header();
            //遍历tags 可以得到图片的所有信息
           //SortedMap tags = app1Header.getTags();
            // 修改EXIF的拍照日期
            SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
            Date curData = new Date(System.currentTimeMillis());
            String time = format.format(curData);
            app1Header.setValue(App1Header.Tag.DATETIMEORIGINAL, time);//拍摄日期
            app1Header.setValue(App1Header.Tag.MAKE, Build.MANUFACTURER + "");//制造商
            app1Header.setValue(App1Header.Tag.MODEL, Build.MODEL + "");//手机型号
            app1Header.setValue(App1Header.Tag.FNUMBER, "4/2");//光圈值
            app1Header.setValue(App1Header.Tag.ISOSPEEDRATINGS, "1");//ISO速度
            app1Header.setValue(App1Header.Tag.FLASH, "0");//闪光灯模式 0-没有使用闪光
            app1Header.setValue(App1Header.Tag.FOCALLENGTH, "26/1");//焦距
            jpegHeaders.save(true);
        }

我看网上写入Exif信息有好多种方法,其中一个就是,使用Android 自带的API中的ExifInterface类可以用来写入Exif信息,但如果你这样:

String filename = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + File.separator + "img.jpeg";
 ExifInterface exifInterface = new ExifInterface(filename);
        //时间
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       exifInterface.setAttribute(ExifInterface.TAG_DATETIME, dateFormat.format(System.currentTimeMillis()));
       //焦距
        exifInterface.setAttribute(ExifInterface.TAG_FOCAL_LENGTH, "fd");
       //闪光灯
       exifInterface.setAttribute(ExifInterface.TAG_FLASH, "关闭(强制)");
        exifInterface.saveAttributes();

其实除了时间和手机生产商等信息其他的都是写不进去的,因为像一些焦距等的值对输入的格式都是有要求的,而setAttribute()方法坑就坑在第二个参数都是String类型,不同的数据的格式我们根本不知道怎么填转换这个类也没有给出提示,因此这个方法行不通。

用第一种方法是可以的.
用到的jar包自取:http://download.youkuaiyun.com/detail/qq_27512671/9482556

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痕迹丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值