转至 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. vim学习笔记(9):vim显示文件名

    如何让vim在编辑模式下显示文件名 在根目录下:~/.vimrc 中追加一行: set laststatus=2 shell 下执行命令: echo "set laststatus=2&qu ...

  2. MyBean-关于plugMap共享对象

    plugMap实现了对象的存储,使用setObject,和getObject来对对象进行存储   内部其实是一个列表,而且他会在释放的时候会情况尝试释放所有的对象,所以如果你共享的对象提前进行了释放, ...

  3. 使用TCP协议的NAT穿透技术(转)

    其实很早我就已经实现了使用TCP协议穿透NAT了,但是苦于一直没有时间,所以没有写出来,现在终于放假有一点空闲,于是写出来共享之. 一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基 ...

  4. decode和encode

    作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  5. Android线程通信

    摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传 ...

  6. tomcat7.0 windows部署使用80端口问题

    如果安装有.net的IDE,那么80端口容易被IIS内的站点占用,如果不是则手动查找. 1:在命令行中输入netstat -ano,得到端口号对应的PID pid这么来显示

  7. 基于jQuery鼠标点击弹出登陆框效果

    基于jQuery鼠标点击弹出登陆框效果.这是一款扁平样式风格的jQuery弹出层登陆框特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <input type=" ...

  8. burpsuite两个变量的爱情故事

    抓包的时候在攻击类型处选择[Cluster bomb] 在payload type这里设置类型为[simple list] 第一个是账号 第二个是密码 分批加载即可

  9. bash里wget失败

    直接使用wget是可以的,然而在shell脚本里却不行,后来发现原来是换行符的问题,编辑器默认的是\r\n,一不留神,自己把自己坑了

  10. Linux watchdog 关闭退出功能

    Linux 程序退出的时候,程序是会把 watchdog 调用 release 功能.