三星手机拍照,上传照片或者下载导致图片旋转90°的解决办法。

news/2024/11/20 13:33:13/

项目需求。
因为项目中需要对拍照之后的图片进行上传。
(这也是一个简单的问题)
但是就是三星手机(三星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是我们压缩比例。

以上都是我们解决三星图片旋转的问题了。
在此感谢我们的卢浩小同学的帮助。


http://www.ppmy.cn/news/303500.html

相关文章

智能手机列表

智能手机列表 这是世界上已发布的智能手机的列表和详细规格。 本列表按照企业分类,按照企业名拼音首字母排序,手機按照發布時間排序。 Android智能手機(圖為三星Galaxy Note 10系列) iOS智能手機(圖為iPhone 6系列&am…

拆机清灰重装系统数据恢复——心得汇总

一、前言 听说,会拆机&清灰&重装系统的工科男更容易得到女生的青睐。。。 于是,这么多年来在强大的网络支持下,我学会了这些技能,有了自己的一套工具,还掌握了一些基本的电脑维修常识。 因此,立…

win7下安装ubuntu10.04双系统

临近寒假了项目不紧,我计划在自己的笔记本上安装ubuntu10.04系统,因为不想舍弃好用的VS2010,于是决定在本上保留win7,装双系统.附言:本教程是在华硕A40J型号的笔记本上用光盘安装win7ubuntu10.04双系统,有不同硬件或软件需求的同学在安装过程中不一定碰到和我相同的问题,敬请参…

相机闪存卡数据恢复方法/数码相机误删照片恢复详解

很多喜欢玩摄影的朋友都知道,美能达相机自诞生以来就是技术达人,上世纪末被柯尼卡收购,本世纪初被索尼收购,但在技术创新方面一直没有落伍。历史上对自动对焦和光学防抖结构作出过不可替代的贡献。不过在做工、操作性方面一直备受…

新手购买数码相机的十点建议

最近小编在网络上溜达,看看网友都在关心些什么,发现了有位网友用切身经历总结出了几大购买数码相机的注意事项,虽然内容只是个人观点,不过大家还是可以从中总结出不少的东西。  1、不一定要求CCD尺寸大,一般来说&…

05 DIY流星观测站——相机简介

相关系列文章 01 DIY流星观测站02 DIY流星观测站——手把手搭建指南03 DIY流星观测站——设备选型与采购04 DIY流星观测站——镜头简介05 DIY流星观测站——相机简介 相机相关的知识也是异常的多,有很多知识点搞不懂,俺是大自然的搬运工。如有错误的内…

JAVA 二维码图片生成和base64位加密解密

支持带logo图片 引入包 <!--二维码工具类--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.google.zx…

NC61.两数之和(map及优化解法)

两数之和 问题描述 题目描述 给出一个整数数组&#xff0c;请在数组中找出两个加起来等于目标值的数&#xff0c; 你给出的函数twoSum 需要返回这两个数字的下标&#xff08;index1&#xff0c;index2&#xff09;&#xff0c;需要满足 index1 小于index2.。注意&#xff1a;下…