• 【Android】相册图片选取——图片旋转


    从Android相册选取图片的时候需要手动进行旋转,否则竖屏(两种——正拿,反拿)拍的照片会横屏显示,横屏(也是两种)拍的照片也会出问题,照片会旋转90度,180度,270度,这个信息被记录在照片的exif信息中。

    Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。(来自百度百科)

    在Exif信息中有一个就是记录拍照时候的状态的设备方向的:Orientation。在Android里面,获取这个信息的代码如下:

     1 //图片旋转
     2         ExifInterface exifInterface = null;
     3         try {
     4             exifInterface = new ExifInterface(fileName);
     5         } catch (IOException e) {
     6             // TODO Auto-generated catch block
     7             e.printStackTrace();
     8              // Calculate inSampleSize
     9             options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    10             // Decode bitmap with inSampleSize set
    11             options.inJustDecodeBounds = false;
    12             return BitmapFactory.decodeFile(fileName, options);
    13         }
    14         //获取图片的旋转角度
    15         int tag = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
    16         int orientation = 0;
    17         if (tag == ExifInterface.ORIENTATION_ROTATE_90) {
    18                 orientation = 90;
    19         } else if (tag == ExifInterface.ORIENTATION_ROTATE_180) {
    20                 orientation = 180;
    21         } else if (tag == ExifInterface.ORIENTATION_ROTATE_270) {
    22                 orientation = 270;
    23         }

    fileName是文件的绝对路径,获取的角度就记录在Orientation中。下面是图片旋转的代码:

    1 options.inSampleSize = calculateInSampleSize(options, reqHeight, reqWidth);
    2 options.inJustDecodeBounds = false;
    3 Matrix m = new Matrix();
    4 bitmap = BitmapFactory.decodeFile(fileName, options);
    5 int width = bitmap.getWidth();
    6 int height = bitmap.getHeight();
    7 m.setRotate(orientation);
    8 return Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);

    (注:上面的代码融合代码的放缩操作,由caculateInSampleSize()进行)

  • 相关阅读:
    用 Mac 给树莓派重装系统
    Python:matplotlib 中文乱码的解决方案
    Python: 通过 pip 安装第三方包后依然不能 import
    Python: 安装 sklearn 包出现错误的解决方法
    grub2引导安装kali2.0及安装ibus拼音输入法
    2015移动安全挑战赛 第一题
    Linux kali 3.14-kali1-amd64 编译安装 wine 1.7.33
    git clone https协议问题
    常见问题
    Sieve_of_Eratosthenes
  • 原文地址:https://www.cnblogs.com/lqminn/p/2782815.html
Copyright © 2020-2023  润新知