Android 从图库中获取图像是旋转的

2024-01-01

我试图让用户从图库中选择个人资料图片。我的问题是有些图片向右旋转。

我像这样启动图像选择器:

Intent photoPickerIntent = new Intent();
photoPickerIntent.setType("image/*");
photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(photoPickerIntent, "Select profile picture"), Global.CODE_SELECT_PICTURE);

我从 onActivityResult 获取图像,如下所示:

Uri selectedPicture = data.getData();
profilePic = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), selectedPicture);

我怎样才能使图像不旋转?

UPDATE:

根据我收到的一些有用的答案,我设法提出了以下工作解决方案(这只是一个工作代码,写得不好)。我很想得到您关于如何改进它的反馈!

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == Activity.RESULT_OK && requestCode == Global.CODE_SELECT_PICTURE) {

        // Get selected gallery image
        Uri selectedPicture = data.getData();
        // Get and resize profile image
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = activity.getContentResolver().query(selectedPicture, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        Bitmap loadedBitmap = BitmapFactory.decodeFile(picturePath);

        ExifInterface exif = null;
        try {
            File pictureFile = new File(picturePath);
            exif = new ExifInterface(pictureFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }

        int orientation = ExifInterface.ORIENTATION_NORMAL;

        if (exif != null)
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                loadedBitmap = rotateBitmap(loadedBitmap, 90);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                loadedBitmap = rotateBitmap(loadedBitmap, 180);
                break;

            case ExifInterface.ORIENTATION_ROTATE_270:
                loadedBitmap = rotateBitmap(loadedBitmap, 270);
                break;
        }           
    }
}

public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
    Matrix matrix = new Matrix();
    matrix.postRotate(degrees);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

你可以使用Exif接口 http://developer.android.com/reference/android/media/ExifInterface.html修改方向:

public static Bitmap modifyOrientation(Bitmap bitmap, String image_absolute_path) throws IOException {
    ExifInterface ei = new ExifInterface(image_absolute_path);
    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

    switch (orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
        return rotate(bitmap, 90);

    case ExifInterface.ORIENTATION_ROTATE_180:
        return rotate(bitmap, 180);

    case ExifInterface.ORIENTATION_ROTATE_270:
        return rotate(bitmap, 270);

    case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
        return flip(bitmap, true, false);

    case ExifInterface.ORIENTATION_FLIP_VERTICAL:
        return flip(bitmap, false, true);

    default:
        return bitmap;
    }
}

public static Bitmap rotate(Bitmap bitmap, float degrees) {
    Matrix matrix = new Matrix();
    matrix.postRotate(degrees);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

public static Bitmap flip(Bitmap bitmap, boolean horizontal, boolean vertical) {
    Matrix matrix = new Matrix();
    matrix.preScale(horizontal ? -1 : 1, vertical ? -1 : 1);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

为了从图像的 uri 中获取图像的绝对路径,请检查这个答案 https://stackoverflow.com/a/20559175/1922137

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 从图库中获取图像是旋转的 的相关文章

  • Android ACTION_DATE_CHANGED 广播

    我有 Nexus S 当我在手机上手动更改日期时 ACTION DATE CHANGED 并不总是被广播 如果我将日期从 2014 年 2 月 13 日更改为 2014 年 2 月 14 日 我还没有获得 ACTION DATE CHANG
  • 如何以编程方式从 mipmap 文件夹加载图像? [复制]

    这个问题在这里已经有答案了 如何从 加载图像mipmap以编程方式保存文件夹 与可绘制对象一样 img setImageResource imageId 我使用的是Android Studio 1 2 1 In 安卓工作室我们有mipmap
  • 以编程方式启用/禁用广播接收器

    我们有一个可以扫描蓝牙设备的应用程序 负责扫描的代码应仅在启用蓝牙时运行 此外 我们希望随时禁用 启用此功能 我们选择实现一个注册BluetoothAdapter ACTION STATE CHANGED广播的BroadcastReceiv
  • 将文本视图包裹在图像视图周围

    晚上好 我正在尝试将文本包裹在图像视图中 就像这里提出的问题一样 Textview 环绕 View https stackoverflow com questions 3626750 textview wrap around view 在风
  • 如何防止 Activity 在后退操作时重新加载

    我有连接到互联网以获取数据的应用程序 我可以多层次访问数据 假设我从第 3 级开始 在第 4 级我决定返回 每当我按回之前的活动时 就会从互联网重新加载数据 有可能阻止这种情况吗 我尝试以单顶模式运行该活动 将数据加载代码移至 single
  • 在 doInBackground 方法中启动活动

    在下面的代码中 我从互联网下载 json 并希望显示在列表中 如果列表为空 则转到另一个活动 但其他活动未启动 没有错误 但没有启动活动 感谢您的帮助 package ir mohammadi android nightly import
  • 使用 appcelerator titan 在 android 中后退按钮退出应用程序

    我是钛开发的新手 在本机 android 中 如果我们按下后退按钮 则仅当前活动将被关闭 并且它将返回到上一个活动 但是当我使用 Titanium 在 Android 中按下后退按钮时 它会从应用程序退出 我怎样才能改变这种行为 有两种类型
  • 如何从另一个应用程序向一个应用程序添加视图

    我的应用程序叫做我的好应用 MyNiceApp 主要只是一个加载视图的核心coreView在主活动中onCreate coreView由用户根据需要下载的其他插件的视图填充 我定义了核心视图上的各个区域 这些区域可以通过 MyNiceApp
  • Android Activity 和 Service 关系 - 暂停后、停止后

    假设创建了 Activity A 然后 A 启动了一个 Service S 并将其自身绑定到 S S 通知 A 更新 这将导致 A 的状态发生变化 Android 暂停或停止 A 后 A 和 S 会发生什么 例如 暂停 A 是否会自动解除它
  • 如何设置上拉刷新SwipeRefreshLayout

    我看到很多 ListView 下拉刷新的库 但是当从上到下拉动时它们是工作的 但是从下到上拉动时我如何刷新 我可以用这个做吗滑动刷新布局 http developer android com reference android suppor
  • 完成特定 Activity 的所有实例

    应用程序中可以有很多活动 最后启动的活动保留在堆栈顶部 按下后它会完成当前活动 我有一系列活动 这是流程 如果我们有 A B C 1 D C 2 活动 C 1 和 C 2 是在导航应用程序时启动的活动 C 的两个不同实例 因此 必需的是清除
  • 无法调整 Android React Native 模块中线性布局子项的大小

    完整代码在这里 https github com sbaar ResizableLLRN 这里有关于 java 中正确行为和 React Native 中错误行为的视频 https drive google com file d 0Bxl2
  • ScrollView 只能承载一个直接子级,但它只有一个

    每当我开始活动时 我都会收到此错误 这是完整的堆栈跟踪 Process com example PID 28799 java lang RuntimeException Unable to start activity ComponentI
  • 我可以在导航组件中使用多个 NavHostFragment 吗?

    如果您难以理解以下段落 请查看我制作的流程图 我目前正在制作一个带有 3 个顶级目的地的笔记应用程序 顶级目标之一 NotesList 显示用户创建的注释列表 NotesList 有一个过滤器按钮 可显示带有 FilterMenu 目标的底
  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 从 Activity 调用选项卡式片段方法

    我有一项活动由三个片段组成 这些片段使用使用 PagerAdapter 的操作栏选项卡 我想要做的是从主活动访问活动选项卡式片段中的方法 我已经尝试了下面的代码 但这只是将片段返回为空 所以我猜它无法在选项卡中找到它 NPListFragm
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 如何为背景图像添加内边距

    我有一个LinearLayout其中有一个背景图像 一个 9 修补的 png 文件 如何向左和右添加填充 以使背景图像不占据整个宽度 我努力了android paddingLeft and android paddingRight 但这并没

随机推荐

  • 未记录的支持 Date.parse 格式?

    MDN s 的文档Date parse https developer mozilla org en JavaScript Reference Global Objects Date parse says 参数 dateString一个字符
  • 如何同时在2个不同的symfony2防火墙上进行身份验证?

    我有一个包含 2 个区域的 Symfony 应用程序 一个区域用于客户端从网页访问 另一个区域用于来自 AJAX 和 Web 服务的 API 调用 每个区域都由自己的防火墙保护 WEB 界面通过登录表单和 API 进行身份验证http ba
  • 如何在视图集中添加自定义权限

    创建模块时 如何在 django Rest Framework 的视图集中添加除默认权限之外的自定义权限 我有权限 fix an appointment 在下面的视图集中 如何包含此权限 拥有此权限的人只能进行创作 我的views py文件
  • 使用 Python 请求提取 href URL

    我想使用 python 中的 requests 包从 xpath 中提取 URL 我可以获取文本 但我尝试没有给出 URL 有人可以帮忙吗 ipdb gt webpage xpath xpath url text Text of the U
  • 在 tkinter 中显示网格布局单元

    有没有trick使用它时显示网格布局单元格 或单元格的边框 以便直观地了解幕后发生的情况 我已经搜索了一点 但还没有找到任何东西 如果您为包含框架指定颜色 并使用选项在单元格之间放置填充 则背景将通过间隙渗透 这只适用于有小部件的地方 如果
  • Ktor 中的表单身份验证

    我是新来的Kotlin and Ktor试图查看身份验证部分 所以我得到了以下代码 路由 和 bye 工作正常 但路由 login 给出空白页面 package blog import kotlinx html import kotlinx
  • Opencv 矩阵元素的列和

    我需要分别计算所有列中元素的总和 现在我正在使用 矩阵 cross corr 应该被求和 Mat cross corr summed for int i 0 i
  • /vagrant挂载后如何运行nginx.service

    我想做的事 我正在尝试使 nginx 加载配置 vagrant由vagrant自动安装 所以我编辑了 nginx service 使其在安装共享文件夹后启动 但它不起作用 当然nginx是在virtualbox guest utils se
  • 常量正确性可以提高性能吗?

    我已经多次读到 在 C 或 C 代码中强制 const 正确性不仅是可维护性方面的良好实践 而且还可以允许编译器执行优化 然而 我也读到了完全相反的内容 它根本不会影响性能 因此 您是否有示例表明 const 正确性可以帮助您的编译器提高程
  • 使用 Intent 的 android.content.ActivityNotFoundException

    我正在编写一个应用程序 在其中尝试发送包含一些数据的电子邮件 但是每当我单击 提交 按钮发送电子邮件时 getting 不幸的是应用程序已停止 Error android content ActivityNotFoundException
  • CRAN 软件包依赖于 Bioconductor 软件包安装错误

    我管理描述文件的依赖 建议和导入 最后我将我的包裹提交给CRAN 但是在安装包的过程中 它只安装存放在下面的包CRAN不是为了bioconductor包 此外 它在 Mac OS 上有一个包依赖错误 检查 Mac 操作系统的日志 http
  • 如何基于Gemfile.lock安装gems(不带Gemfile)

    通常 人们会使用bundle install安装宝石 但它需要 Gemfile 和 Gemfile lock 可选 我的情况有点不同 我只有 Gemfile lock 那么我怎样才能安装所有这些基于bundle命令 I tried bund
  • 已弃用的方法“startActivityForResult()”与正确的蓝牙设置

    嘿 我尝试根据官方android开发网站上的信息制作蓝牙服务 但我遇到了不推荐使用的方法 startActivityForResult 我应该怎么做才能正确打开蓝牙设备 这是我的代码 其中包含已弃用的方法 private void enab
  • 为什么 C++20 中不推荐使用 std::is_pod?

    std is pod在 C 20 中已弃用 这样选择的原因是什么 我应该用什么来代替std is pod知道一个类型是否真的是一个 POD POD 正在被两个类别所取代 这两个类别提供了更多细微差别 这2017年11月c 标准会议 http
  • 如何生成线程安全的统一随机数?

    我的程序需要生成某个范围内的许多随机整数 int min int max 每次调用都会有一个不同的范围 什么是一个好的 最好是线程安全的 方法来做到这一点 以下不是线程安全的 并且使用 rand 人们似乎不鼓励这样做 int intRand
  • NSToolbar:如何初始化所选项目?

    我有一个 Mac OS 应用程序 带有一个带有 NSToolbar 的首选项窗口 我的下面还有一个自定义子视图 当用户单击其中一个选项时 会在第一个视图中加载其他 3 个自定义视图 到目前为止 一切都很好 现在我意识到加载窗口时默认情况下不
  • TSQL - 递归 CTE 效率低下 - 需要替代方案

    这是包含示例数据的表格 DECLARE TestTable TABLE ItemID INT A INT B INT Month INT INSERT INTO TestTable VALUES 1234 5 9 1 INSERT INTO
  • Android Studio 4.0.2 Gradle 错误:未为属性“enableGradleWorkers”指定任何值

    我在用Android Studio 4 0 2我收到错误 No value has been specified for property enableGradleWorkers 发生这种情况是因为crashlytics gradle 插件
  • “致命错误:在第 48 行调用 /usr/bin/phpunit 中未定义的方法 PHPUnit_Util_Filter::addfiletofilter()”

    我刚刚在 Ubuntu Linux 服务器上使用 PEAR 安装了 phpunit Linux mccoy 2 6 28 11 server 42 Ubuntu SMP 周五 4 月 17 日 02 45 36 UTC 2009 x86 6
  • Android 从图库中获取图像是旋转的

    我试图让用户从图库中选择个人资料图片 我的问题是有些图片向右旋转 我像这样启动图像选择器 Intent photoPickerIntent new Intent photoPickerIntent setType image photoPi