Android 笔记 exif信息 uri信息

本文介绍了Android中处理图片Exif信息的重要性,特别是orientation数据用于纠正图片旋转问题。详细阐述了Exif信息中的orientation对应角度关系,并提供了解析uri获取图片路径的方法,以便读取和应用Exif信息进行图片旋转操作。

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

exif信息

在解析并显示图像的时候,会需要orientation数据,来得到图片的旋转角度,如果显示的时候不设置角度,那么有orientation信息的图片就方向不对。

orientation在exif信息中,exif是保存在图片中的一系列拍摄信息
有可能不同厂家在里面保存的信息多少有点区别,但是有些公用的信息都有,比如光圈,快门,拍摄模式,白平衡,或者还有一些版权信息等等。

手机保存的jpeg文件里面也有exif信息,从中可以读取orientation信息

但是有一点要注意,就是可能是为了节省空间,orientation数据很短,并不是直接保存的角度。
对应关系如下:(度数都是顺时针旋转)

Value0th Row0th Column描述
1topleft side
2topright side水平翻转
3bottomright side180°
4bottomleft side垂直翻转
5left sidetop顺时针90°+水平翻转
6right sidetop顺时针90°
7right sidebottom顺时针90°+垂直翻转
8left sidebottom逆时针90°

解释一下。
本来图像的像素点是方形排列,0th row和0th column表示第一行和第一列像素
以上表格对应的位置说明的是这第一行和第一列像素在图像中的位置
所以,如果分别在 右/上, 就表示图像顺时针旋转了90度,其他的以此类推。

所以获得的orientation信息是 1-8,在设置图像旋转的时候需要设置成对应的角度。
1 —–0度
6 ——90度
3 ——180度
8 ——270度
其他的有翻转的还没有研究过
matrix.postRotate(degree,pivotX,pivotY)三个参数是角度,旋转中心点X,旋转中心点Y

解析uri

如果要获得exif信息,android里面有一个类需要用到
ExifInterface,名字里面有一个interface,实际上是个class,大概是设计者当时喝多了吧。

exif = new ExifInterface(FileSystemManager.uriToPath(this,uri));
int oriInfo = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,0);
switch (oriInfo) {
                case 6:
                    orientation = 90;
                    break;
                case 3:
                    orientation = 180;
                    break;
                case 8:
                    orientation = 270;
                    break;
                default:
                    orientation = 0;
            }

这个构造方法的参数是一个path,大部分时候需要用uri来解析出来。
在api24的时候添加了两个新的构造方法,参数分别是inputStream和FileDescriptor

如果支持老API版本,就只能用path参数的构造方法
那么怎么用uri解析出path呢

uri构成

content://com.example.project:200/folder/subfolder/etc
———/ —————————– /—/ ————————–/
scheme —— host ————– port ——— path
—- - /———————————–/
————– authority
如上描述的这样,标识了uri的每个部分。
通常如果直接标识file的话,scheme就是file:
如果标识的是android的content的话,scheme就是content:

如果是file,那么直接通过uri.getPath()就可以获得路径了
如果是content,那么就表示这个资源是存储在中央数据库里面的,那么path就表示在数据库的位置,从这里是不能读取文件的,所以需要以下办法。实际上跟读取ContentResolver是一样的

public static String uriToPath(Context context,Uri uri) {
        if(uri==null)
            return null;
        String scheme = uri.getScheme();
        if(scheme==null||scheme.equals(ContentResolver.SCHEME_FILE))
            return uri.getPath();
        if(scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            Cursor cursor = context.getContentResolver().query(
                    uri,
                    new String[]{MediaStore.Images.Media.DATA},
                    null,
                    null,
                    null
            );
            if(cursor!=null&&cursor.moveToFirst()) {
                return cursor.getString(cursor.getColumnIndex(
                        MediaStore.Images.Media.DATA
                ));
            }
        }
        return null;
    }

有了path就可以读取exif了
然后就可以愉快的设置orientation了(实际上就是用Matrix旋转以下图像而已)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值