解决android有的手机拍照后上传图片被旋转的问题_Android

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

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

第一种方式代码:

在onActivityResult里面处理跳转

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

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

<span style="font-size:18px;">   //获取bitmap
    MyApp myApp = (MyApp)getApplication();
    bitmap = myApp.getName();
    System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());
    myBitmap = bitmap;
    myWidth = bitmap.getWidth();
    myHeight = bitmap.getHeight(); 

    // 创建操作图片用的matrix对象
    matrix = new Matrix();
    Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);
    imageView.setBackgroundDrawable(drawable); 

    btnCancel.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) { 

        RotaingActivity.this.finish();
      }
    }); 

    btnRightRotaing.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        myBitmap = rotaingImageView(-90);
      }
    }); 

    btnLeftRotaing.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        myBitmap = rotaingImageView(+90);
      }
    }); 

    btnOK.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        MyApp myApp = (MyApp)getApplication();
        myApp.setName(myBitmap);//修改之后
        System.out.println("OK resultcoder");
        Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);
        setResult(6, intent);
        RotaingActivity.this.finish();
      }
    });
  }
  private Bitmap rotaingImageView(int angle2) {
    //旋转图片 动作
    matrix.postRotate(angle2);
    System.out.println("angle2=" + angle2);
    // 创建新的图片
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
        myWidth, myHeight, matrix, true);
    Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);
    imageView.setBackgroundDrawable(drawable);
    return resizedBitmap;
  }</span> 

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

在onActivityResult里面处理

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

这样就搞定了,此时你上传的照片就是正的了。

第一种方式的图片

以上就是对解决android有的手机拍照后上传图片被旋转的问题,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 解决android
, 旋转照片
, 旋转照片问题
旋转照片上传
ios拍照上传被旋转、ios拍照上传旋转、php 拍照上传图片旋转、手机拍照照片上传旋转、android拍照图片旋转,以便于您获取更多的相关知识。

时间: 2025-01-26 21:47:13

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

解决android有的手机拍照后上传图片被旋转的问题

需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去

Android部分手机拍照后获取的图片被旋转问题的解决方法

调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的.其它品牌的手机都是正常的,就三星出现这个怪事. 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 具体思路: 1.首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个

Android实现从本地图库/相机拍照后裁剪图片并设置头像_Android

先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="v

Android通过手机拍照或从本地相册选取图片设置头像

像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像. 我现在写一个简单的完整代码例子,说明如何在android中实现上述两个头像设置功能. MainActivity.Java文件: package zhangpgil.photo; import java.io.File; import android.support.v7.app.A

Android调用手机拍照功能的方法_Android

本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr

Android调用手机拍照功能的方法

本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr

Android MIUI系统调用拍照后不返回当前activity如何解决

最近在做一个Android下的所见即所得的编辑器,思路是利用内置浏览器webview的html5属性contenteditable来实现,如: <div id='con' class='con' contenteditable='true'>请输入内容</div>. 在实际应用过程中,由于需要插入图片,所以要支持利用摄像头拍照和从图库中的相册选择图片的功能.从图库选图没有任何问题,但是拍照的时候,在小米的miui系统下就出现了其他机型没有出现的bug. 我们先来看代码,先写调用ca

Android应用中拍照后获取照片路径并上传的实例分享_Android

Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap(); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); s

街拍良器 Android特色手机拍照软件复古相机

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 夏天已经姗然而至.街头的帅哥靓女开始穿的凉爽,喜欢街拍的朋友可千万不要错过了这个好时节.对于很多Android手机用户来说,Android的自带摄像软件向来都不是很给力,功能非常的中规中矩,毫无特色可言.今天,泡椒小编凌少我就给大家推荐一款功能给力,充满特色的Android手机拍照软件--复古相机. 测试手机:MOTO 里程碑1代 手机平台: