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

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

作者: Solang | 来源:发表于2018-08-22 15:59 被阅读398次

    在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊!

    解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。

    具体思路: 1、首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个工具类)

    String fileName = ""; 
    /** 
     * 启动相机拍照 
     */
    private void addBitmapShoots() { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // 设置图片要保存的 根路径+文件名 
     fileName = PhotoBitmapUtils.getPhotoFileName(getContext()); 
     File file = new File(fileName); 
     if (!file.exists()) { 
      try { 
       file.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
     startActivityForResult(intent, OPEN_CAMERA); 
    } 
    

    2、在获取相机返回的回调方法onActivityResult()中,修复被旋转的图片并取得修复后的图片路径,有了这个路径后就可以展示出来了

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // 获取相机拍照返回 
     if (resultCode == Activity.RESULT_OK && requestCode == OPEN_CAMERA) { 
      // 得到修复后的照片路径 
      String filepath = PhotoBitmapUtils.amendRotatePhoto(fileName, getContext()); 
     } 
    } 
    

    PhotoBitmapUtils类:

    /** 
     * 集合一些图片工具 
     * 
     * Created by zhuwentao on 2016-07-22. 
     */
    public class PhotoBitmapUtils { 
      
     /** 
      * 存放拍摄图片的文件夹 
      */
     private static final String FILES_NAME = "/MyPhoto"; 
     /** 
      * 获取的时间格式 
      */
     public static final String TIME_STYLE = "yyyyMMddHHmmss"; 
     /** 
      * 图片种类 
      */
     public static final String IMAGE_TYPE = ".png"; 
      
     // 防止实例化 
     private PhotoBitmapUtils() { 
     } 
      
     /** 
      * 获取手机可存储路径 
      * 
      * @param context 上下文 
      * @return 手机可存储路径 
      */
     private static String getPhoneRootPath(Context context) { 
      // 是否有SD卡 
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 
        || !Environment.isExternalStorageRemovable()) { 
       // 获取SD卡根目录 
       return context.getExternalCacheDir().getPath(); 
      } else { 
       // 获取apk包下的缓存路径 
       return context.getCacheDir().getPath(); 
      } 
     } 
      
     /** 
      * 使用当前系统时间作为上传图片的名称 
      * 
      * @return 存储的根路径+图片名称 
      */
     public static String getPhotoFileName(Context context) { 
      File file = new File(getPhoneRootPath(context) + FILES_NAME); 
      // 判断文件是否已经存在,不存在则创建 
      if (!file.exists()) { 
       file.mkdirs(); 
      } 
      // 设置图片文件名称 
      SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault()); 
      Date date = new Date(System.currentTimeMillis()); 
      String time = format.format(date); 
      String photoName = "/" + time + IMAGE_TYPE; 
      return file + photoName; 
     } 
      
     /** 
      * 保存Bitmap图片在SD卡中 
      * 如果没有SD卡则存在手机中 
      * 
      * @param mbitmap 需要保存的Bitmap图片 
      * @return 保存成功时返回图片的路径,失败时返回null 
      */
     public static String savePhotoToSD(Bitmap mbitmap, Context context) { 
      FileOutputStream outStream = null; 
      String fileName = getPhotoFileName(context); 
      try { 
       outStream = new FileOutputStream(fileName); 
       // 把数据写入文件,100表示不压缩 
       mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
       return fileName; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } finally { 
       try { 
        if (outStream != null) { 
         // 记得要关闭流! 
         outStream.close(); 
        } 
        if (mbitmap != null) { 
         mbitmap.recycle(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
      
     /** 
      * 把原图按1/10的比例压缩 
      * 
      * @param path 原图的路径 
      * @return 压缩后的图片 
      */
     public static Bitmap getCompressPhoto(String path) { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = false; 
      options.inSampleSize = 10; // 图片的大小设置为原来的十分之一 
      Bitmap bmp = BitmapFactory.decodeFile(path, options); 
      options = null; 
      return bmp; 
     } 
      
     /** 
      * 处理旋转后的图片 
      * @param originpath 原图路径 
      * @param context 上下文 
      * @return 返回修复完毕后的图片路径 
      */
     public static String amendRotatePhoto(String originpath, Context context) { 
      
      // 取得图片旋转角度 
      int angle = readPictureDegree(originpath); 
      
      // 把原图压缩后得到Bitmap对象 
      Bitmap bmp = getCompressPhoto(originpath);; 
      
      // 修复图片被旋转的角度 
      Bitmap bitmap = rotaingImageView(angle, bmp); 
      
      // 保存修复后的图片并返回保存后的图片路径 
      return savePhotoToSD(bitmap, context); 
     } 
      
     /** 
      * 读取照片旋转角度 
      * 
      * @param path 照片路径 
      * @return 角度 
      */
     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; 
     } 
      
     /** 
      * 旋转图片 
      * @param angle 被旋转角度 
      * @param bitmap 图片对象 
      * @return 旋转后的图片 
      */
     public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { 
      Bitmap returnBm = null; 
      // 根据旋转角度,生成旋转矩阵 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(angle); 
      try { 
       // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 
       returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
      } catch (OutOfMemoryError e) { 
      } 
      if (returnBm == null) { 
       returnBm = bitmap; 
      } 
      if (bitmap != returnBm) { 
       bitmap.recycle(); 
      } 
      return returnBm; 
     } 
    }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ctjyiftx.html