前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android手机拍照后照片被旋转或者需要旋转的问题

Android手机拍照后照片被旋转或者需要旋转的问题

作者头像
wust小吴
发布2019-07-08 16:18:19
3.1K0
发布2019-07-08 16:18:19
举报
文章被收录于专栏:风吹杨柳风吹杨柳

1、读取图片的旋转属性

/**  * 读取图片的旋转的角度  *  * @param path  *            图片绝对路径  * @return 图片的旋转角度  */ private int getBitmapDegree(String path) {     int degree = 0;     try {         // 从指定路径下读取图片,并获取其EXIF信息         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; }

代码语言:javascript
复制
	/**
	 * 将图片按照某个角度进行旋转
	 *
	 * @param bm
	 *            需要旋转的图片
	 * @param degree
	 *            旋转角度
	 * @return 旋转后的图片
	 */
	public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
	    Bitmap returnBm = null;
	  
	    // 根据旋转角度,生成旋转矩阵
	    Matrix matrix = new Matrix();
	    matrix.postRotate(degree);
	    try {
	        // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
	        returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
	    } catch (OutOfMemoryError e) {
	    }
	    if (returnBm == null) {
	        returnBm = bm;
	    }
	    if (bm != returnBm) {
	        bm.recycle();
	    }
	    return returnBm;
	}

在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,可以在onActivityResult方法中,获取到照片数据后,读取它的旋转信息,如果不是0,说明这个照片已经被旋转过了,那么再使用android.graphics.Matrix将照片旋转回去即可。 我的代码中使用了这个方法: // 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存,变成65px Bitmap smallBitmap = UploadImageTools.zoomBitmap(photo,image_px, image_py); //smallBitmap = rotateBitmapByDegree(smallBitmap,90); // 压缩图片,得到base64str ,用于上传到服务器 ll_com_cover.setImageBitmap(smallBitmap);// 图片选择 那个位置的视图改成 // 当前用户选择的图片 ll_com_cover.setOnClickListener(new ImageDeleteListener());// 设置图片删除事件,用户上传了一张照片,可以很快就删除,重新选择 //photo = rotateBitmapByDegree(photo,90); base64ImgStr = UploadImageTools.BitmapToBase64Str2(photo);// 把要上传的图片转换成为64位码 // 预览成功之后 马上把图片发送给服务器 但是最后还是没有使用,放弃了, 决定还是搞个预览功能,并且支持旋转,由用户自己来决定到底是选择 竖着的还是横着的 文章未完,敬请期待

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年10月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档