转至 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. 读取本地已有的.db数据库

    public class MyDB extends SQLiteOpenHelper { // 数据库的缺省路径 private static String DB_PATH ; private sta ...

  2. jquery改变元素上下排列的顺序

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. MySQL查看当前运行的事务和执行的账户

    -- 查看当前运行的事务,这点在变更表结构之前必须要查看select * from information_schema.innodb_trx; -- 查看当前运行的事务的账户和事务开始的时间,及其事 ...

  4. 【Ubuntu】查看GPU状态

    watch -n 10 nvidia-smi TensorFlow指定GPU CUDA_DEVICE_ORDER="PCI_BUS_ID" CUDA_VISIBLE_DEVICES ...

  5. Where-To-Put-The-Auto-Layout-Code(AutoLayout代码应该放在哪里?)

    Where-To-Put-The-Auto-Layout-Codehtml, body {overflow-x: initial !important;}html { font-size: 14px; ...

  6. C语言 · 猜灯谜

    标题:猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交“请猜谜”三 ...

  7. 键盘 Input子系统

    应用层测试代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <li ...

  8. Centos7下Yum安装PHP5.5,5.6,7.0

    默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...

  9. SpringBoot2 集成三种连接池 c3p0 hikari druid

    Hikari 1.首先集成 hikari springboot默认集成,只需要简单的配置即可 1.1 首先导入包 <dependency> <groupId>com.zaxxe ...

  10. SWT中ole/activex实践--操作word的一个例子

    http://setting.iteye.com/blog/747295 ———————————————————————————————————————————————— 这几年,做了很多word/e ...