考虑到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度的解决方案相关推荐

  1. 关于Android 竖屏录制,在PC端播放被逆时针旋转了90度

    更新: 事实上这是视频播放器的原因,使用自带播放器,win7上H264会被逆时针旋转90度,而win10上MPEG_4_SP会被逆时针旋转90度. 使用MediaRecorder录制视频,发现在PC端 ...

  2. 解决H5 IOS手机图片上传时图片会旋转90°问题

    解决H5 IOS手机图片上传时图片会旋转90°问题 Vant 官方给出的解答需要自己解决,没有处理. 解决办法主要使用了 compressorjs 插件库 一.Vant UI库Uploader 组件图 ...

  3. android竖屏显示

    本文原创,来自http://blog.csdn.net/knock,转载请保留本行 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要旋转FrameBuffer.   ...

  4. Android 拍照后图片的旋转,合并,兼容性 相机开发

    在看这篇文章之前,我建议先看相机开发基础 针对这个功能需要做自定义相机,根据Camera相机类和SurfaceView类来实现自定义图形预览拍照功能. 但在实现过程中出现几个难点: 1.如何将自己产品 ...

  5. android竖屏固定,ANDROID强制锁定竖屏_APP固定设置竖屏或横屏

    1.XML锁定横屏或竖屏 在没有设置屏幕方向的情况下会默认设置为:android:screenOrientation="unspecified".即未指明屏幕方向.属性取值land ...

  6. android竖屏固定,安卓教程:设置竖屏固定壁纸

    Android默认的壁纸设置是横屏滚动的,如果把心爱的女神/男神的照片设置为壁纸那叫一个惨不忍睹啊.相信总会有人为此而烦恼!今天少数派课堂教大家如何设置竖屏固定壁纸. 前言:由于设置竖屏固定壁纸的方法 ...

  7. android 竖屏rpg游戏,可以竖屏玩的rpg角色扮演大型手游排行

    游戏是目前绝大多数人放松的渠道,但是大部分人群是需要上班的,双休日休息还来不及玩什么游戏呢,但是我有办法解决这种问题,那就是找到竖屏游戏,可以单手操作的那种,就算在车上一手拉着扶手,另一只手也可以玩游 ...

  8. android 竖屏资源文件,Android不同分辨率屏幕下自适应资源文件

    1.不同的layout Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout ...

  9. android wear gear2,开发大神实现三星Gear 2上启动Android Wear

    原标题:开发大神实现三星Gear 2上启动Android Wear 安珀网(公众号:ianpocom) 三星希望打造自己的Tizen OS智能手表生态系统.在三星的智能手表中,运行Android We ...

最新文章

  1. html form通过ajax提交表单提交数据,Jquery通过Ajax方式来提交Form表单的具体实现
  2. JAVA 判断其是否为合法标识符
  3. C语言申请内存时堆栈大小限制
  4. JS 继承各种方法的优劣比较 ----JS 学习笔记(五)
  5. opencv 的norm_OpenCV视频分析-Meanshift、Camshiftamp;运动轨迹绘制
  6. Linux 命令(97)—— info 命令
  7. java dom获取命名空间属性_Java DOM XML解析::获取元素属性值
  8. arraylist的remove()循环删除问题
  9. Django之POST GET与前后端交互
  10. C语言在工业工程专业的应用,工业工程专业知识介绍
  11. CIO:节省IT部门开支十招
  12. oracle orcl 更名,Oracle 11gR2 用户重命名(rename user)
  13. 网站采集工具免费采集发布网站后台
  14. 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
  15. 网络安全工程师视频教程从入门到精通学习_网络安全入门教程
  16. 斐讯K2P路由器设置AP模式(大部分路由器通用
  17. 《缠中说禅》炒股经典理论
  18. ie11安装程序无法继续 因为你的计算机,ie11无法安装解决方法详解
  19. 神经派考古学 - 推荐一个blog
  20. 【数据结构与算法】| Map和Set

热门文章

  1. CT探测器中“排”与“层”的实现方法
  2. ajax自动加载blogjava和博客园的rss
  3. ABP 中反序列化大小写不敏感
  4. 模型融合(集成方法) -投票法
  5. 年轻人,你的时间到哪啦?
  6. nodejs常用核心模块介绍
  7. Linux下提示命令找不到:bash:command not found
  8. 华为任正非:谢谢他们给我们做了宣传,美国赢不了5G市场
  9. 微信小程序3--微信小游戏
  10. 【Python】conda实现虚拟环境的创建