转至 http://blog.csdn.net/walker02/article/details/8211628

需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器

遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。

解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。

第一种方式代码:

在onActivityResult里面处理跳转

  1. <span style="font-size:18px;">      Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);
  2. MyApp myApp = (MyApp)getApplication();
  3. myApp.setName(bitmap);//修改之后的名称
  4. myApp.setPhoto(isPhoto);
  5. startActivityForResult(intent, 1);</span>

在RotaingActivity里面就可以作相应的旋转处理了

  1. <span style="font-size:18px;">      //获取bitmap
  2. MyApp myApp = (MyApp)getApplication();
  3. bitmap = myApp.getName();
  4. System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());
  5. myBitmap = bitmap;
  6. myWidth = bitmap.getWidth();
  7. myHeight = bitmap.getHeight();
  8. // 创建操作图片用的matrix对象
  9. matrix = new Matrix();
  10. Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);
  11. imageView.setBackgroundDrawable(drawable);
  12. btnCancel.setOnClickListener(new OnClickListener() {
  13. @Override
  14. public void onClick(View v) {
  15. RotaingActivity.this.finish();
  16. }
  17. });
  18. btnRightRotaing.setOnClickListener(new OnClickListener() {
  19. @Override
  20. public void onClick(View v) {
  21. myBitmap = rotaingImageView(-90);
  22. }
  23. });
  24. btnLeftRotaing.setOnClickListener(new OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. myBitmap =  rotaingImageView(+90);
  28. }
  29. });
  30. btnOK.setOnClickListener(new OnClickListener() {
  31. @Override
  32. public void onClick(View v) {
  33. MyApp myApp = (MyApp)getApplication();
  34. myApp.setName(myBitmap);//修改之后
  35. System.out.println("OK resultcoder");
  36. Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);
  37. setResult(6, intent);
  38. RotaingActivity.this.finish();
  39. }
  40. });
  41. }
  42. private  Bitmap rotaingImageView(int angle2) {
  43. //旋转图片 动作
  44. matrix.postRotate(angle2);
  45. System.out.println("angle2=" + angle2);
  46. // 创建新的图片
  47. Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
  48. myWidth, myHeight, matrix, true);
  49. Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);
  50. imageView.setBackgroundDrawable(drawable);
  51. return resizedBitmap;
  52. }</span>

第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。

在onActivityResult里面处理

  1. BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
  2. bitmapOptions.inSampleSize = 8;
  3. File file = new File(SD_CARD_TEMP_DIR);
  4. /**
  5. * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
  6. */
  7. int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
  1. <span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);
  2. bitmap = cameraBitmap;
  3. /**
  4. * 把图片旋转为正的方向
  5. */
  6. bitmap = ImageDispose.rotaingImageView(degree, bitmap);
  7. upload(bitmap);</span>
  1. <span style="font-size:18px;">  /**
  2. * 旋转图片
  3. * @param angle
  4. * @param bitmap
  5. * @return Bitmap
  6. */
  7. public static Bitmap rotaingImageView(int angle , Bitmap bitmap) {
  8. //旋转图片 动作
  9. Matrix matrix = new Matrix();;
  10. matrix.postRotate(angle);
  11. System.out.println("angle2=" + angle);
  12. // 创建新的图片
  13. Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
  14. bitmap.getWidth(), bitmap.getHeight(), matrix, true);
  15. return resizedBitmap;
  16. }</span>
    1. /**
    2. * 读取图片属性:旋转的角度
    3. * @param path 图片绝对路径
    4. * @return degree旋转的角度
    5. */
    6. public static int readPictureDegree(String path) {
    7. int degree  = 0;
    8. try {
    9. ExifInterface exifInterface = new ExifInterface(path);
    10. int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    11. switch (orientation) {
    12. case ExifInterface.ORIENTATION_ROTATE_90:
    13. degree = 90;
    14. break;
    15. case ExifInterface.ORIENTATION_ROTATE_180:
    16. degree = 180;
    17. break;
    18. case ExifInterface.ORIENTATION_ROTATE_270:
    19. degree = 270;
    20. break;
    21. }
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. return degree;
    26. }

解决android有的手机拍照后上传图片被旋转的问题的更多相关文章

  1. 部分Android或IOS手机拍照后照片被旋转的问题

    1.我们平时手机拍的照片,传到电脑后,使用Photoshop或者其它图片浏览工具打开时,发现图片是被转过的.可是Windows上预览却是正的.其实原因是部分Android或IOS手机拍照后,将图片角度 ...

  2. 部分Android手机拍照后照片被旋转的解决方案

      在部分Android手机(如MT788.Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°.180°.270°),这个情况很不符合预期.仔细分析了一下,因为照片属性中是存储了 ...

  3. Android使得手机拍照功能的发展(源共享)

    Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...

  4. android 解决 多品牌手机拍照问题,尤其是小米手机

    先上个图吧 .点击头像弹出下面对话框,然后直接上代码. 头像是自定义控件实现的圆形头像,当然就目前而言 想要实现 圆形头像的资料太多了,随便找个就行 <com.kuibu.jucai.widge ...

  5. 解决Android后台清理APP后,程序自动重启的问题

    最近解决了一个Android APP的bug,发现APP在被后台清理后,会自动重启.现象很奇怪,有的手机(HTC)后台清理后,程序会再次重启,而有的手机(小米)则不会.猜想可能是小米手机内部做了处理, ...

  6. 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题

    使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...

  7. Xamarin.Android 调用手机拍照功能

    最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...

  8. android 加密手机完毕后待机两分钟出现有频率的杂音

    这个音效是code里面主动加的,是为了提醒end user输入PIN的一个提示音,也标志着加密手机动作的完毕. 详细位置是在alps\packages\apps\Settings\src\com\an ...

  9. Android实现手机拍照功能

    一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmln ...

随机推荐

  1. python *和**的用法

    1.使用场景 *和**用在函数参数列表中 2.*作函数参数 以列表的形式提供参数 def foo(*args): for arg in args: print(arg) foo(1, 2, 3) 运行 ...

  2. 每日英语:The Delicate Protocol Of Hugging

    I'm not a hugger. When I see a registered personal-space invader coming my way at a party, the music ...

  3. Spark中的IsNotNull函数怎么用

    Spark中的IsNotNull函数怎么用 在这里看到的这个函数,就是判断是否为空,但是开始不知道怎么用,后来找到了,要在View中用,也就是SparkSQL中.如下: spark.sql(" ...

  4. listen的参数backlog的意义

    实验环境:Ubuntu16.04,内核版本:4.4.0-59-generic   根据man listen得到的解释如下:   backlog参数定义了存放pending状态(挂起.护着搁置)的连接的 ...

  5. H3C交换机配置的备份与恢复(TFTP方法)

    局域网维护中,有时候我们需要对网络设备的配置进行备份与还原. 相信有很多网管员备份配置都是采用display current命令查询当前设备运行配置信息,然后采用ctrl+c,ctrl+v的方式将信息 ...

  6. C# 去除json字符串key引号

    采用正则表达式去除: 方法 /// <summary> /// 去除json key双引号 /// </summary> /// <param name="js ...

  7. Faiss教程:索引(1)

    索引是faiss的关键知识,我们重点介绍下. 索引方法汇总 有些索引名,我就不翻译了,根据英文名去学习更准确. 索引名 类名 index_factory 主要参数 字节数/向量 精准检索 备注 精准的 ...

  8. ISO8601时间格式

    格式解析 R2/2015-06-04T19:25:16.828696-07:00/P1DT10S 上面的字符串通过"/"分为了三部分即: 重复次数/开始时间/运行间隔 重复次数 R ...

  9. wcf中的Message类

    客户端->服务端—>客户端 客户端代码: using (new OperationContextScope(client.InnerChannel))            {       ...

  10. [Linux实用工具]Ubuntu环境下SSH的安装及使用

    SSH分为客户端和服务端. 服务端是一个守护进程,一般是sshd进程,在后台运行并响应来自客户端的请求.提供了对远程请求的处理,一般包括公共密钥认证.密钥交换.对称密钥加密和非安全连接. 客户端一般是 ...