zoukankan      html  css  js  c++  java
  • 【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()进行)

  • 相关阅读:
    会话状态服务器解决方法
    让笔记本在插上外置鼠标时触摸板自动关闭
    “检测到有潜在危险的 Request.Form(QueryString) 值”的解决方法
    SQL Server2008不能登录解决方法
    SqlHelper
    修改IE查看源代码编辑器
    由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例解决办法
    性能测试用户模型(二):用户模型图
    索引帖:性能测试新手误区系列
    性能测试用户模型(三):基础数据分析、场景数据
  • 原文地址:https://www.cnblogs.com/lqminn/p/2782815.html
Copyright © 2011-2022 走看看