项目需求。
因为项目中需要对拍照之后的图片进行上传。
(这也是一个简单的问题)
但是就是三星手机(三星note3),出现拍照之后照片旋转了九十度。
然后我们上传上去,然后通过其他手机请求url再次显示还是旋转过的。
说说我们解决问题的路径。
1.
起初以为我们上传照片的时候就是旋转过了的,但是查看图片所在的位置,结果发现图片是正的。
那么是为什么再次下载图片还是旋转的,我们就想到了
这个类ExifInterface 这个类可以获得图片一些信息
1.旋转角度
2.时间
反正就是有很多图片的信息啦。
参考:
ExifInterface更多信息
这里最重要的可能都是旋转角度了。
我们怎么能获取角度了?
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
以上的代码可以看出来,通过图片的路径可以获取到。
大家可能猜到下一步干什么了?
既然我们可以获取角度,那么我们为什么不能改角度,因为文件中是正的,下载下来也是正的,为什么显示的时候出现旋转,估计就是因为这个旋转属性的问题 了(我是猜想哦)
那么我们就尝试着更改属性。
ExifInterface exifInterface = new ExifInterface(path);
exifInterface.setAttribute(exifInterface.TAG_ORIENTATION, String.valueOf(exifInterface.ORIENTATION_ROTATE_90));
exifInterface.saveAttributes();
再次旋转九十度试试,结果那还是什么变化都没有,我擦(我那个气啊)
属性值的确是改了,但是就是没有旋转。(大家可以自行尝试一下,验证一下)
2.
那我就只能用其他方法了(被逼的,这里顺带说一下我们老板让我把图片的大小压缩一下,因为我们每次都需要上传图片,可能需要耗费很多流量,而且有非常慢,这里我们也优化一下,一举两得)
这里可以看下我前面怎么处理图片缩放比例的
第一个方法:
calculateInSampleSize 搜索这个方法
这个方法就是缩放比例。
第二个方法:
因为图片旋转我们需要判断角度需要用到上面的readPictureDegree方法
第三个方法:
既然知道角度了我们就要把图片旋转过来,那么怎么旋转啦?
/**
* 旋转图片
*
* @param bitmap
* @param rotate
* @return
*/
private static Bitmap rotateBitmap(Bitmap bitmap, int rotate) {
if (bitmap == null)
return null;
int w = bitmap.getWidth();
int h = bitmap.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(rotate);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
然后怎么办?
因为我们上传一般都是根据文件上传的(File),
那么我们把旋转之后bitmap写入到文件中去。
/**
* 添加图片到sd卡并规定压缩比例,100默认原图
*/
public static File saveBitmap(Bitmap bitmap, String savePath, int quality) {
if (bitmap == null)
return null;
try {
File f = new File(savePath);
if (f.exists()) f.delete();
FileOutputStream fos = new FileOutputStream(f);
f.createNewFile();
// 把Bitmap对象解析成流
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);
Log.d("bitmap", bitmap.getRowBytes() + "");
fos.flush();
fos.close();
bitmap.recycle();
return f;
} catch (IOException e) {
e.printStackTrace();
bitmap.recycle();
return null;
}
}
最后我们是这么组装的。
public static File getSmallBitmap(String filePath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 480, 800);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile(filePath, options);
if (bm == null) {
return null;
}
int degree = readPictureDegree(filePath);
bm = rotateBitmap(bm, degree);
return saveBitmap(bm, filePath, 70);
}
我们缩放规格是480X800 所以就写的是固定的。70是我们压缩比例。
以上都是我们解决三星图片旋转的问题了。
在此感谢我们的卢浩小同学的帮助。