Android相机参数setPictureSize导致图片出现条纹

2024-04-18

我正在尝试使用 Android 相机拍照。我需要捕获 1600(宽)x 1200(高)图像(第 3 方供应商要求)。我的代码似乎适用于许多手机摄像头,但 setPictureSize 会导致某些手机(三星 Galaxy S4、三星 Galaxy Note)崩溃,并导致其他手机(Nexus 7 平板电脑)上出现条纹图片。至少在 Nexus 上,我想要的尺寸显示在 getSupportPictureSizes 列表中。

我尝试过指定方向,但没有帮助。使用默认图片尺寸拍摄照片效果很好。

下面是一个裸奔的例子:

对于我的图像捕获,我需要 1600x1200、jpg、30% 压缩,因此我捕获的是 JPG 文件。

我想我有三个选择: 1) 弄清楚如何捕获 1600x1200 尺寸而不发生崩溃或裸奔,或者 2) 弄清楚如何将默认图片尺寸更改为 1600x1200 的 JPG。 3)目前我不知道的其他事情。

我发现其他一些帖子也有类似的问题,但不完全相同。我已经进入尝试的第二天,但没有找到解决方案。这是一篇接近的帖子:

相机图片转换为位图会导致图像混乱 https://stackoverflow.com/questions/15404547/camera-picture-to-bitmap-results-in-messed-up-image(所有建议都没有帮助我)

这是我的代码部分,在我遇到 S4/Note/Nexus 7 之前一直运行良好。我现在添加了一些调试代码:

Camera.Parameters parameters = mCamera.getParameters();
Camera.Size size = getBestPreviewSize(width, height, parameters);

if (size != null) {
    int pictureWidth = 1600;
    int pictureHeight = 1200;

    // testing
    Camera.Size test = parameters.getPictureSize();
    List<Camera.Size> testSizes = parameters.getSupportedPictureSizes();
    for ( int i = 0; i < testSizes.size(); i++ ) {
        test = testSizes.get(i);
    }

    test = testSizes.get(3);
    // get(3) is 1600 x 1200
    pictureWidth = test.width;
    pictureHeight = test.height;

    parameters.setPictureFormat(ImageFormat.JPEG);
    parameters.setPictureSize(pictureWidth, pictureHeight);
    parameters.setJpegQuality(30);
    parameters.setPreviewSize(size.width, size.height);

    // catch any exception
    try {
        // make sure the preview is stopped
        mCamera.stopPreview();

        mCamera.setParameters(parameters);
        didConfig = true;
    catch(Exception e) {
        // some error presentation was removed for brevity
        // since didConfig not set to TRUE it will fail gracefully
    }
}

这是我保存 JPG 文件的代码部分:

PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        if ( data.length > 0 ) {

            String fileName = "image.jpg";

            File file = new File(getFilesDir(), fileName);
                String filePath = file.getAbsolutePath();

             boolean goodWrite = false;
             try {
                 OutputStream os = new FileOutputStream(file);
                 os.write(data);
                 os.close();

                goodWrite = true;
            } catch (IOException e) {
                 goodWrite = false;
             }

             if ( goodWrite ) {
                // go on to the Preview
             } else {
                // TODO return an error to the calling activity
             }

        }

        Log.d(TAG, "onPictureTaken - jpeg");
    }
};

任何关于如何正确设置拍照参数或如何裁剪或调整生成的照片大小的建议都会很棒。特别是如果它可以与旧相机(API 级别 8 或更高版本)一起使用!基于需要图片的完整宽度,我只能裁剪掉顶部。

Thanks!

编辑:这就是我最终所做的:

我首先处理 Camera.Parameters getSupportedPictureSizes,以使用第一个高度和宽度均大于我所需尺寸且宽度与高度比相同的参数。我将相机参数设置为该图片尺寸。

然后拍照后:

BitmapFactory.Options options = new BitmapFactory.Options();;
options.inPurgeable = true;

// convert the byte array to a bitmap, taking care to allow for garbage collection
Bitmap original = BitmapFactory.decodeByteArray(input , 0, input.length, options);
// resize the bitmap to my desired scale 
Bitmap resized = Bitmap.createScaledBitmap(original, 1600, 1200, true);

// create a new byte array and output the bitmap to a compressed JPG
ByteArrayOutputStream blob = new ByteArrayOutputStream();
resized.compress(Bitmap.CompressFormat.JPEG, 30, blob);

// recycle the memory since bitmaps seem to have slightly different garbage collection
original.recycle();
resized.recycle();

byte[] desired = blob.toByteArray();

然后我将所需的 jpg 写入文件中以供上传。


test = testSizes.get(3);
// get(3) is 1600 x 1200

数组不要求有 4 个以上元素,更不用说第四个元素为 1600x1200。

1) 弄清楚如何在不崩溃或裸奔的情况下捕获 1600x1200 尺寸

无法保证每台设备都能以精确的分辨率拍摄照片。您不能为分辨率指定任意值——它必须是受支持的图片尺寸之一。Some设备支持任意值,而其他设备会给你损坏的输出(就像这里的情况)或者会彻底崩溃。

2)弄清楚如何将默认图片尺寸更改为1600x1200的JPG

我不知道有一个“默认图片尺寸”,而且除此之外,这样的尺寸将是不可变的,因为它是默认的。更改图片尺寸是上面的选项#1。

3)目前我不知道的其他事情。

对于支持两个轴上更大的分辨率的设备,请以该分辨率拍摄照片,然后裁剪为 1600x1200。

对于所有其他设备,其中一个或两个轴都小于所需的尺寸,请以适合您的任何分辨率(最大、最接近 4:3 宽高比等)拍摄照片,然后拉伸/裁剪以达到 1600x1200。

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

Android相机参数setPictureSize导致图片出现条纹 的相关文章

  • 如何使用retrofit2进行GET请求?

    我有一个在本地主机上运行的安静的 Web 服务 我想在该剩余 URL 上发出 Retrofit2 GET 请求 MainActivity java private void requestData public static final S
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 如何在 kotlin 中检查 lambda 空值

    在 Kotlin 中如何检查 lambda 是否为空 例如 我有这样的签名 onError Throwable gt Unit 我如何区分它的默认值是应用于主体还是应用于此函数的值 您无法测试 lambda 的主体是否为空 因此它不包含源代
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • Android复杂布局线性和相对

    I have to implement a layout like shown in the diagram and I do not know the best combination to achieve the required de
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 在android中使用BaseActivity的不同活动中的通用标头

    我想编写一次代码并在不同的活动中使用 我创建了一个Base Activity class为了那个原因 此外 不同活动中所有布局的标题都是相同的 我在以下人员的帮助下做到了这一点
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case
  • 如何检查设备上是否安装了文本转语音 (TTS) 的特定语言数据?

    我正在创建一个使用文本转语音的应用程序 我希望用户能够离线使用它 因此我检查设备上是否安装了 TTS 数据 以下是执行此操作的代码 Check tts data is installed Intent checkTTSIntent new

随机推荐

  • 如何对选择器输入中的选项进行文本换行,如果选项的长度很长,则选项通常会出现在屏幕之外

    pickerInput 中的选择始终位于单行中 有没有办法可以将它们带到下一行 当选择的长度很长导致选择超出屏幕时 这是一个问题 我特别需要 pickerInput 因为它具有实时搜索 全选 取消全选功能 library shiny lib
  • gcc -lpthread 不工作

    我的系统中安装了 ubuntu 11 我有一个使用 pthread 库的 C 程序 我收到错误Undefined reference to sem wait 即使我已经用标志编译了 lpthread 例如 gcc lpthread prog
  • 如何在 drools 规则引擎中动态更新规则

    我正在开发 drools 规则引擎 在这个场景中将 when 块中的值从 1000 更改为 2000 将符号从 gt 更改为 rule payment when account Paymentinfo transaction lt 1000
  • 使用python将数据写入谷歌云存储

    我找不到使用 python 将本地计算机中的数据集写入谷歌云存储的方法 我进行了很多研究 但没有找到任何与此相关的线索 需要帮助 谢谢 简单的例子 使用谷歌云 https googlecloudplatform github io goog
  • 使用 GTK 构建 GUI#

    我可能需要使用 C 和 Mono 构建 GTK GUI 如果我理解正确的话 这意味着我有3个选择 编写 C 代码来调用 GTK 包装器类 GUI 是 在代码中 使用 MonoDevelop GUI 设计器 这使用 stetic 标记构建了一
  • 在 Xamarin.Forms 中编写设备平台特定的代码

    我有以下内容Xamarin Forms ContentPage类结构 public class MyPage ContentPage public MyPage do work to initialize MyPage public voi
  • 在 Apps 脚本上创建新触发器时收到错误

    尝试创建新触发器时收到此错误 脚本授权失败 请检查您的弹出窗口阻止程序设置 然后重试 已尝试允许该网站接受弹出窗口 甚至关闭弹出窗口阻止程序 但没有产生任何影响 有人有解决办法吗 我遇到了同样的问题 并设法通过首先从脚本编辑器手动执行我的脚
  • PHP 7 用户会话问题 - 无法初始化存储模块

    在 PHP 7 0 中使用各种 PHP 框架会话驱动程序时存在错误 我最初在使用 CodeIgniter 数据库驱动程序时遇到了这个问题 并认为这是一个 CodeIgniter 问题 但后来在多个会话驱动程序和多个框架上遇到了这个问题 此时
  • 在android中使用多点触控进行旋转、缩放和移动

    我想在多点触摸事件上旋转 缩放和移动图像 它似乎工作正常 但工作不完美 我真的很想修复我的错误代码 所以请帮助我 我的代码在那里 public class ImageControl extends Activity DragView dra
  • 使用 Selenium IDE 解析查询字符串值的 URL

    我是集成测试的新手 但到目前为止 我已经使用 Se IDE 构建了一套测试 取得了巨大的成功 当我运行测试时 我突然意识到我正在生成大量数据 并且我想自己清理 我的大多数测试都涉及创建一个新的 页面 并且 id 在查询字符串中可用 我想让
  • __doPostBack() 函数不起作用 (asp.net)

    我正在尝试从 JS 代码触发按钮事件 但doPostBack在JS函数中reg 不指向 c 代码 请告诉我出了什么问题 这是我的代码
  • 正则表达式返回未定义的字符串

    我试图从磁力链接中提取哈希值 但它返回不明确的 var tesst magnet xt urn btih 2B78EDFDDC87DC9605FB285997A80B787888C194 var test tesst match magne
  • 当文本框为空时,C++ Windows 窗体应用程序出现未处理的异常错误

    我正在 Visual Studio 中为 C 课程构建温度转换应用程序 它是一个 Windows 窗体应用程序 我的问题是 当我运行应用程序时 如果我没有在 txtFahrenheit 或 txtCelsius2 文本框中输入任何内容 我会
  • 委托和变量范围

    我有以下代码 public void SetMove Position3D pos float time float linearity bool relative ExecuteOnActiveClients delegate Neuro
  • 32 位整数按位与

    如何在 C 中对两个 32 位整数执行按位 AND 运算 Related 最常见的 C 位运算 https stackoverflow com questions 93744 most common c bitwise operations
  • WPF MVVM - ItemsControl 内部的命令绑定

    我目前正在将一个小型 WPF 项目转换为 MVVM 我有一个List
  • 在 jQuery 模板中获取索引

    我正在使用 jQuery 模板插件 不知道如何获取项目的索引 http api jquery com category plugins templates http api jquery com category plugins templ
  • 解析器组合器的类型

    如果我有一个解析器a Parser A和一个解析器b Parser B然后我可以将它组合成一个解析器a b Parser Either A B 这可行 但当您开始添加更多替代方案并获取类似类型时 会变得有点棘手Either A Either
  • Play Framework 2.6 CSRF 和会话

    我遇到了奇怪的问题 我正在我的网站上实现购物车功能 并使用会话来存储购物车位置 我有一个 POST 操作来将新位置添加到购物车 并且我启用了 CSRF 过滤器来保护网站 我在产品页面上用ajax调用它 所以第一次调用没问题 但第二次调用说未
  • Android相机参数setPictureSize导致图片出现条纹

    我正在尝试使用 Android 相机拍照 我需要捕获 1600 宽 x 1200 高 图像 第 3 方供应商要求 我的代码似乎适用于许多手机摄像头 但 setPictureSize 会导致某些手机 三星 Galaxy S4 三星 Galax