保存图像缩略图而不是 MediaStore.ActionImageCapture 中的完整图像

2024-02-21

我目前正在尝试通过 android 拍照,并将图像保存到稍后将其上传到数据库的位置。在学习了一些在线教程后,我发现我使用的代码仅保存我正在捕获的图像的低分辨率缩略图,而不是完整图像。

有没有办法获得完整尺寸的图像进行保存?由于使用数据库的软件的设置方式,格式需要为 Jpeg。

按预期拍摄照片:

    private void _openCamera_Click(object sender, EventArgs e)
    {
       Intent intent = new Intent(MediaStore.ActionImageCapture);
       StartActivityForResult(intent, 0);
    }

这是图像最终保存为缩略图的位置。理想情况下,这部分是我们修改的唯一代码:

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
       base.OnActivityResult(requestCode, resultCode, data);

       Bitmap bitmap = (Bitmap)data.Extras.Get("data");

       this._photo.SetImageBitmap(bitmap);

       MemoryStream memStream = new MemoryStream();
       bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
       this._tempImageData = memStream.ToArray();
    } 

Update:SushiHangover 的反应完美无缺。为了使用缓存的图像,我使用了以下代码:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode != Result.Ok || requestCode != 88)
        {
            return;
        }

        Bitmap bitmap = BitmapFactory.DecodeFile(cacheName);

        this._photo.SetImageBitmap(bitmap);

        MemoryStream memStream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
        this._tempImageData = memStream.ToArray();
    }

这是一个真的很简单适用于全尺寸照片的官方 Android 照片基础知识的 C# 版本。

  • https://developer.android.com/training/camera/photobasics#java https://developer.android.com/training/camera/photobasics#java

注意:这会将全尺寸照片保存在应用程序的沙盒中cache目录

添加“Resources/xml/file_paths.xml”文件:

<?xml version="1.0" encoding="UTF-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache_images" path="." />
</paths>

添加文件提供者within清单的application打开/关闭标签:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>

创建照片文件并请求照片应用程序:

cacheName = Path.Combine(CacheDir.AbsolutePath, Path.GetTempFileName());

using (var cacheFile = new Java.IO.File(cacheName)) 
using (var photoURI = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", cacheFile))
using (var intent = new Intent(MediaStore.ActionImageCapture))
{
    intent.PutExtra(MediaStore.ExtraOutput, photoURI);
    StartActivityForResult(intent, 88);
}

Note: cacheName是一个类级别变量,在 OnActivityResult 方法中需要它

在 OnActivityResult 中,对您的照片执行一些操作...

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    if (resultCode == Result.Ok && requestCode == 88)
    {
        // Do something with your photo...
        Log.Debug("SO", cacheName );
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存图像缩略图而不是 MediaStore.ActionImageCapture 中的完整图像 的相关文章

  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 设备收到 GCM Android 通知但未显示

    尽管通知已在应用程序本身中注册 但我的 Ionic Android 应用程序的 GCM Cloud 消息通知未出现在我的设备的主屏幕中 我正在使用 npm 模块node gcm https www npmjs com package nod
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • onCreateOptionsMenu(菜单菜单)是什么

    方法中的Menu和menu两个参数是什么onCreateOptionsMenu Menu menu 以及如何使用这个方法 我还有一个问题为什么this参数用于 Intent intent new Intent this DisplayMes
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 使用当前日期时间的 RecyclerView 的动态节标题

    我将使用 RecyclerView 作为节标题 我想在 SQLite 数据库中插入每个日期和时间数据时创建节标题 我按照以下链接获取了此解决方案 但没有成功 请参考下图 对于上面的图像数据 使用以下代码或部分是静态的 List
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • Android ProGuard 混淆库:让类无法工作

    Intro 我在 AS 1 项目中有 2 个模型 带有一些 公共 API 类 的 Android 库项目 Android APP依赖上述库 库模块在依赖列表中 Task 我想混淆我的库项目 因为我想将其公开为公共 SDK 但又要保护我的代码
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 错误:升级到 lombok 1.16.2 后包 javax.annotation 不存在

    我的 android 项目使用 lombok 1 16 0 构建得很好 但是一旦我将依赖项更改为目标 1 16 2 我在使用 lombok 注释的任何地方都会收到以下错误 Error 20 1 error package javax ann
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • 虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

    我正在尝试使用 c 在 Windows 窗体中创建一个类似 swype 的键盘 我有两个问题 A 我无法重现手指滑动动作 b 我无法识别不同按键下的字母 对于第一个问题 我使用了 Graphics 类和 Pen 类 并像这样使用它 bool
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 如何消除按钮和其他视图之间的额外间隙?

    当我创建按钮视图时 Android 总是在该按钮与其下方的其他视图之间创建一些额外的空间 在下面的示例中 第二个按钮上方有一个按钮 您可以看到这两个按钮之间的间隙 我怎样才能摆脱这个差距 谢谢
  • 如何为单个函数设置 ICC 属性“fp-model precision”,以防止关联优化?

    我正在实施卡汉求和 http en wikipedia org wiki Kahan summation algorithm 在支持 gcc47 gcc48 clang33 icc13 和 icc14 编译的项目中 作为该算法的一部分 我想

随机推荐