exif信息
在解析并显示图像的时候,会需要orientation数据,来得到图片的旋转角度,如果显示的时候不设置角度,那么有orientation信息的图片就方向不对。
orientation在exif信息中,exif是保存在图片中的一系列拍摄信息
有可能不同厂家在里面保存的信息多少有点区别,但是有些公用的信息都有,比如光圈,快门,拍摄模式,白平衡,或者还有一些版权信息等等。
手机保存的jpeg文件里面也有exif信息,从中可以读取orientation信息
但是有一点要注意,就是可能是为了节省空间,orientation数据很短,并不是直接保存的角度。
对应关系如下:(度数都是顺时针旋转)
Value | 0th Row | 0th Column | 描述 |
---|---|---|---|
1 | top | left side | 0° |
2 | top | right side | 水平翻转 |
3 | bottom | right side | 180° |
4 | bottom | left side | 垂直翻转 |
5 | left side | top | 顺时针90°+水平翻转 |
6 | right side | top | 顺时针90° |
7 | right side | bottom | 顺时针90°+垂直翻转 |
8 | left side | bottom | 逆时针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旋转以下图像而已)