项目需求。
因为项目中需要对拍照之后的图片进行上传。
(这也是一个简单的问题)
但是就是三星手机(三星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 90Matrix 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 inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, 480, 800);// Decode bitmap with inSampleSize setoptions.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是我们压缩比例。
以上都是我们解决三星图片旋转的问题了。
在此感谢我们的卢浩小同学的帮助。