问题场景:
1.iOS系统的苹果手机竖屏拍照或者从相册选择竖屏情况下拍的照片上传到tfs服务器安卓手机下载展示的时候是旋转了90°的图片,但是苹果手机展示没有问题.
我去网上进行原因的查找,发现iphone默认横屏拍照才是正确的方向,所以竖屏拍照会携带逆时针旋转90°的信息.
经过多番验证,苹果手机竖屏拍照上传的时候,是存在逆时针旋转90°的标识的,上传到服务器之后返回链接
http://7xrqzv.com1.z0.glb.clouddn.com/mbp-head-image-dev-20042399-1483772239277.png(链接可能失效~~)
直接看在浏览器打开的结果:在IE浏览器上查看是逆时针旋转90°,但是在chrome浏览器上查看是正常的;
下载之后查看的结果:在windows上从任一浏览器下载,利用windows自带的图片查看器查看就是逆时针旋转90°的,利用爱奇艺图片查看器查看就是正常的,但是在Mac上下载,查看都是正常的,下载下来之后存在安卓手机本地相册发现还是旋转90°的图片.
结论:我发现每个系统,软件对于图片的处理是不一样的,有一些是不会对角度进行处理,有角度就让他存在在信息里不去旋转,有一些就按照角度进行旋转,将角度变成0°存在信息里.
解决方案:IOS在上传图片之前首先进行旋转角度信息的检查,将不是0°的情况都改变成0°.
2.部分安卓手机(如MT788,Note2)竖屏拍照直接将图片传过来展示的时候是旋转了90°的图片,但是上传到tfs再下载下来展示的图片又是正常的.
public static Bitmap rotateBitmap(Bitmap b, String filepath) {
int degrees = getExifOrientation(filepath);
if(degrees != 0 && b != null) {
Matrix m = new Matrix();
m.setRotate((float)degrees, (float)b.getWidth() / 2.0F, (float)b.getHeight() / 2.0F);
try {
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);
if(b != b2) {
b.recycle();
b = b2;
}
} catch (OutOfMemoryError var5) {
;
}
}
return b;
}
public static int getExifOrientation(String filepath) {
short degree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(filepath);
} catch (IOException var4) {
;
}
if(exif != null) {
int orientation = exif.getAttributeInt("Orientation", -1);
if(orientation != -1) {
switch(orientation) {
case 3:
degree = 180;
case 4:
case 5:
case 7:
default:
break;
case 6:
degree = 90;
break;
case 8:
degree = 270;
}
}
}
return degree;
}
通过这两个方法,先获取到旋转的角度信息再进行旋转即可解决.
以上是我自己真实遇到的问题,可能在你们开发的过程中也有过类似的但是不完全相同的经历,希望我的解决方案帮助到大家.