三星Android5.0系统以上 相册中选择相片后 图片旋转了90度问题
这个问题在实际应用开发中也是无意中碰到,下面给出代码解决
其中avatar为头像地址,path为在相册中选择完的相片地址
int degree = ImageUtils.readPictureDegree(path); Bitmap bmpOk = ImageUtils.rotateToDegrees(BitmapUtils.getSampleBitmap(path, 800, 800).getBitmap(), degree); mHeadImageView.setImageBitmap(bmpOk);
下面是ImageUtils工具类中readPictureDegree方法,和rorateToDegress方法
/** * 图片旋转 * @param tmpBitmap * @param degrees * @return */ public static Bitmap rotateToDegrees(Bitmap tmpBitmap, float degrees) { Matrix matrix = new Matrix(); matrix.reset(); matrix.setRotate(degrees); return tmpBitmap = Bitmap.createBitmap(tmpBitmap, 0, 0, tmpBitmap.getWidth(), tmpBitmap.getHeight(), matrix, true); } /** * 读取照片exif信息中的旋转角度 * @param path 照片路径 * @return角度 */ 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; }
然后将旋转后的bitmap保存到本地,将保存的地址赋值给avatar
try { avatar = BitmapUtils.saveImg(bmpOk,"head"); } catch (Exception e) { e.printStackTrace(); }
下面给出我的BitmapUtils工具类saveImg的方法
/** * 将bitmap作为图片保存到本地并返回保存地址 * @param b * @param name * @return * @throws Exception */ public static String saveImg(Bitmap b, String name) throws Exception { String path = BaseApplication.getBaseApplication().getBaseExternalCacheDir() + File.separator + "temp/image/"; File mediaFile = new File(path + File.separator + System.currentTimeMillis()+name + ".jpg"); if (mediaFile.exists()) { mediaFile.delete(); } if (!new File(path).exists()) { new File(path).mkdirs(); } mediaFile.createNewFile(); FileOutputStream fos = new FileOutputStream(mediaFile); b.compress(Bitmap.CompressFormat.PNG, 80, fos); fos.flush(); fos.close(); b.recycle(); b = null; System.gc(); return mediaFile.getPath(); }
好了,现在你选择照片后,控件显示的图片正常角度,最后拿到这个我们旋转成正常图片保存的地址后再上传到你的服务器就OK了。