转至 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. 每日英语:Missing at Mobile World Congress: Innovation

    The hottest showcase for new technology at this year's Mobile World Congress wasn't in the event's c ...

  2. 【JavaScript】脚本

    javascript: void((function() { var as = document.getElementsByTagName('a'); for (var i = 0, j = as.l ...

  3. 用nodejs的express框架在本机快速搭建一台服务器

    [本文出自天外归云的博客园] 简介 用express框架在本机搭建一个服务器,这样大家可以通过指定的url来在你的服务器上运行相应的功能. Express是一个基于nodejs的框架,我们可以用它来完 ...

  4. 让cpu跑到100%的bat文件

    请你新建一个叫“virus.bat”的批处理文件,里面填写上如下三段命令: Echo "welcom to the aqjava's world"Tree /fCall virus ...

  5. js使用正则替换掉所有的“”

    需求,使用bootstrap 的 summernote上传图片,转换成文件流,上传给后台,上传用json传送,不能有“” content = content.replace(/\"/ig,& ...

  6. [转]java中通过request获取路径中的不同信息

    原文地址:http://blog.csdn.net/lv_shijun/article/details/40819859 aa为工程中的项目名 bb为webRoot下的文件夹 1.request.ge ...

  7. C语言 · 字符串的展开

     算法训练 字符串的展开   时间限制:1.0s   内存限制:256.0MB      在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d ...

  8. ubuntu 安装 mkfs.ubifs

    ubi 文件系统的制作需要 mkfs.ubifs 工具 但是又没有直接的 sudo apt-get install , 只能通过以下方式 sudo apt-get install mtd-utils

  9. [mqtt]mqtt嵌入式移植

    github eclipse paho source code: https://github.com/mqtt/mqtt.github.io/wiki/libraries STM32 mqtt移植: ...

  10. .net lock的使用

    内容参考自:http://daimajishu.iteye.com/blog/1079107 一. 基本使用形式 二.应用举例 三.需要注意的地方 四.lock应避免锁定public 类型或不受程序控 ...