当前位置: 首页 > 编程笔记 >

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

衡玄裳
2023-03-14
本文向大家介绍解决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有的手机拍照后上传图片被旋转的问题,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍详解利用exif.js解决ios手机上传竖拍照片旋转90度问题,包括了详解利用exif.js解决ios手机上传竖拍照片旋转90度问题的使用技巧和注意事项,需要的朋友参考一下 HTML5+canvas进行移动端手机照片上传时,发现iOS手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题;Android手机没这个问题。 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios

  • 本文向大家介绍Android 开发手机(三星)拍照应用照片旋转问题解决办法,包括了Android 开发手机(三星)拍照应用照片旋转问题解决办法的使用技巧和注意事项,需要的朋友参考一下 Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没有问题,唯独三

  • 我一直在开发一个摄像头应用程序,所有的工作都是拍摄和保存照片。但我希望在拍摄照片时显示的Imageview能够保存在实际拍摄的照片中。可能吗? 现在,我一直试图让图像视图与我绘制相机预览的布局相同。 我想,也许如果它画在与相机相同的视图上,那么它也会看到图像和照片。 有没有人知道这是否可能,或者我必须采取另一种方法?如果是这样,链接到其他解决方案如何做到这一点将不胜感激:) 谢谢 编辑:我一直遵循

  • 本文向大家介绍Android设置拍照或者上传本地图片的示例,包括了Android设置拍照或者上传本地图片的示例的使用技巧和注意事项,需要的朋友参考一下 前几天,我们客户端这边收到了市场部的一个需求,需要在我们订单成交后,我们的客户端有一个上传交易凭证的功能,那么如何在Android实现上传图片的这个功能呢?在我进行编码之前,我先问自己几个问题。 第一, 图片是直接选择图库里的,还是需要拍照和选择图

  • 本文向大家介绍Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0),包括了Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)的使用技巧和注意事项,需要的朋友参考一下 Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像。 Problem: 拍好照片,点击裁剪,弹Toast“无法加载此图片”。 Sol

  • 在我的应用程序中,用户从相机捕获图像或从图库中选择图像,然后将其转换为pdf并上载到服务器,现在我的问题是,从相机捕获的图像在某些设备上旋转,我有代码尝试解决此问题,但它不起作用 任何建议或问题在哪里,没有错误代码或任何东西