转至 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. NGUI制作字体的三种方法

    主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...

  2. 【C/C++】关于隐式转换·面试题分析

    题目 以下两个程序片段A 和B ,问哪个能进入循环? 片段A: unsigned short i; unsigned ; ; i < index-; i++) { ........ } 片段B: ...

  3. 【嵌入式】S3C2410平台移植linux 2.6.14内核

    小续 第一次接触内核的东西,有点小激动啊 激动归激动,这实验还是要继续做下去,书上三两句话就带过去的,剩下的就留给我们了,着实考验动手能力啊 当编译过内核之后,发现这个过程也不复杂嘛(复杂的是内核的配 ...

  4. LeetCode: Largest Rectangle in Histogram 解题报告

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  5. 进入Linux救援(rescue)模式的四大法门

    原文:http://blog.51cto.com/xxrenzhe/1272838 适用场景: 当误操作修改系统启动文件/etc/fstab, /etc/rc.d/rc.sysinit时,就会造成系统 ...

  6. spring batch初识

    Spring Batch是什么?  Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上自己的一些 ...

  7. mybatis注解方式批量插入数据

    @Insert("<script>" + "INSERT INTO cms_portal_menu(name,service_type,index_code) ...

  8. android开发(29) 自定义曲线,可拖动,无限加载

    项目需要 做一个曲线,该曲线的数据时不断加载的.如下图,当不断向左拖动时,图形曲线要随着拖动移动,并在拖动到边界时需要加载更多数据. 先看步骤: 1.在Activity里放一个surfaceView ...

  9. css3学习系列之初识 transform (一)

    一.transform是哈? 从字面意思来看 transform的含义是:改变,使…变形:转换,对 没错 就是变形 变形当有 放大缩小 东倒 西歪,刚好css3中 transform 也出这个 放几个 ...

  10. 安卓程序代写 网上程序代写[原]BluetoothAdapter解析

    这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...