android 竖屏拍照旋转90度,三星等机型上拍照后图片被旋转90度的解决方案
考虑到Android7.0以后拍照修改了调用和返回方式,找到了一个看起来还不错的第三方库,实际可能并非如此。
-TakePhoto
在三星Note3和S6上测试,发现竖屏拍照后返回的照片是横屏的,在其它手机上又是正常的。查了资料发现三星手机很多都有这个问题,看到了歪果仁开发者对这个问题近乎骂街的回复,发现这属于三星的一个系统级Bug。竖屏拍照后得到的照片文件就是横屏的,只有应用对这些照片重新处理。
/**
* 读取图片的旋转的角度
*
* @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;
}
如上代码可以获取图片文件的旋转角度,可以发现在这些三星手机上的到的返回值都是ExifInterface.ORIENTATION_ROTATE_90,也就是说这些三星手机即便是竖屏拍照,的到的图片文件被顺时针旋转90度后,就变成了横屏文件。
还好查了一下库本身支持设置重新调整角度的配置,在
TakePhotoOptions
/**
* 是对拍的照片进行旋转角度纠正
*/
private boolean correctImage;
public void setCorrectImage(boolean correctImage) {
this.correctImage = correctImage;
}
但是设置后发现问题依然存在,不再通过gradle引入远程代码的方式,下载了TakePhoto的源码,重新以Library module的方式引入到项目中。
调试代码定位到了问题所在
ImageRotateUtil
/**
* 将图片按照某个角度进行旋转
*
* @param bm 需要旋转的图片
* @param degree 旋转角度
* @return 旋转后的图片
*/
private 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) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (returnBm == null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}
在如上代码中returnBm重新赋值的时候,也就是将原始图片重新旋转角度得到正确角度的图片这里,这个地方尼玛OOM了。由于库没有做压缩,一张图片在重新做旋转的时候竟然需要60M的内存空间,GGG。
好吧,问题找到了,那就先改来能用吧,
/**
* 纠正照片的旋转角度
* @param path
*/
public void correctImage(Context context,Uri path){
String imagePath=TUriParse.parseOwnUri(context,path);
int degree;
if((degree=getBitmapDegree(imagePath))!=0){
// *** add to fix oom
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true; // 设置成了true,不占用内存,只获取bitmap宽高
BitmapFactory.decodeFile(imagePath, opts);
opts.inSampleSize = calculateInSampleSize(opts, 360, 640); // 调用上面定义的方法计算inSampleSize值
opts.inJustDecodeBounds = false;// 使用获取到的inSampleSize值再次解析图片
opts.inPreferredConfig = Bitmap.Config.RGB_565;
opts.inDither = true;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, opts);
// *** add to fix end
if(bitmap==null)return;
Bitmap resultBitmap=rotateBitmapByDegree(bitmap,degree);
if(resultBitmap==null)return;
try {
resultBitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(new File(imagePath)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (OutOfMemoryError e){
e.printStackTrace();
}
}
}
总的来说就是先压缩图片,编码格式改为Bitmap.Config.RGB_565,减少图片编码大小;设置opts.inSampleSize来压缩图片大小,尽量按照你需要的图片大小来压缩图片,减少OOM发生的可能性。
验证完美。
android 竖屏拍照旋转90度,三星等机型上拍照后图片被旋转90度的解决方案相关推荐
- 关于Android 竖屏录制,在PC端播放被逆时针旋转了90度
更新: 事实上这是视频播放器的原因,使用自带播放器,win7上H264会被逆时针旋转90度,而win10上MPEG_4_SP会被逆时针旋转90度. 使用MediaRecorder录制视频,发现在PC端 ...
- 解决H5 IOS手机图片上传时图片会旋转90°问题
解决H5 IOS手机图片上传时图片会旋转90°问题 Vant 官方给出的解答需要自己解决,没有处理. 解决办法主要使用了 compressorjs 插件库 一.Vant UI库Uploader 组件图 ...
- android竖屏显示
本文原创,来自http://blog.csdn.net/knock,转载请保留本行 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要旋转FrameBuffer. ...
- Android 拍照后图片的旋转,合并,兼容性 相机开发
在看这篇文章之前,我建议先看相机开发基础 针对这个功能需要做自定义相机,根据Camera相机类和SurfaceView类来实现自定义图形预览拍照功能. 但在实现过程中出现几个难点: 1.如何将自己产品 ...
- android竖屏固定,ANDROID强制锁定竖屏_APP固定设置竖屏或横屏
1.XML锁定横屏或竖屏 在没有设置屏幕方向的情况下会默认设置为:android:screenOrientation="unspecified".即未指明屏幕方向.属性取值land ...
- android竖屏固定,安卓教程:设置竖屏固定壁纸
Android默认的壁纸设置是横屏滚动的,如果把心爱的女神/男神的照片设置为壁纸那叫一个惨不忍睹啊.相信总会有人为此而烦恼!今天少数派课堂教大家如何设置竖屏固定壁纸. 前言:由于设置竖屏固定壁纸的方法 ...
- android 竖屏rpg游戏,可以竖屏玩的rpg角色扮演大型手游排行
游戏是目前绝大多数人放松的渠道,但是大部分人群是需要上班的,双休日休息还来不及玩什么游戏呢,但是我有办法解决这种问题,那就是找到竖屏游戏,可以单手操作的那种,就算在车上一手拉着扶手,另一只手也可以玩游 ...
- android 竖屏资源文件,Android不同分辨率屏幕下自适应资源文件
1.不同的layout Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout ...
- android wear gear2,开发大神实现三星Gear 2上启动Android Wear
原标题:开发大神实现三星Gear 2上启动Android Wear 安珀网(公众号:ianpocom) 三星希望打造自己的Tizen OS智能手表生态系统.在三星的智能手表中,运行Android We ...
最新文章
- html form通过ajax提交表单提交数据,Jquery通过Ajax方式来提交Form表单的具体实现
- JAVA 判断其是否为合法标识符
- C语言申请内存时堆栈大小限制
- JS 继承各种方法的优劣比较 ----JS 学习笔记(五)
- opencv 的norm_OpenCV视频分析-Meanshift、Camshiftamp;运动轨迹绘制
- Linux 命令(97)—— info 命令
- java dom获取命名空间属性_Java DOM XML解析::获取元素属性值
- arraylist的remove()循环删除问题
- Django之POST GET与前后端交互
- C语言在工业工程专业的应用,工业工程专业知识介绍
- CIO:节省IT部门开支十招
- oracle orcl 更名,Oracle 11gR2 用户重命名(rename user)
- 网站采集工具免费采集发布网站后台
- 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
- 网络安全工程师视频教程从入门到精通学习_网络安全入门教程
- 斐讯K2P路由器设置AP模式(大部分路由器通用
- 《缠中说禅》炒股经典理论
- ie11安装程序无法继续 因为你的计算机,ie11无法安装解决方法详解
- 神经派考古学 - 推荐一个blog
- 【数据结构与算法】| Map和Set