首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android全屏相机-同时保持相机的选择比例

Android全屏相机-同时保持相机的选择比例
EN

Stack Overflow用户
提问于 2015-03-30 09:23:35
回答 2查看 2.1K关注 0票数 6

我们正在尝试构建类似于Instagram摄像头屏幕的东西。即允许用户拍摄square照片。在运行out时,我必须能够让用户在fullScreen模式下看到相机。我们希望强制用户在portrait模式下拍摄图像

获取相机可能的比率

我们正在计算从best中获得的camera比率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) h / w;

    if (sizes == null) {
        return null;
    }

    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    for (Camera.Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
            continue;
        }
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Camera.Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}

把它变成全屏。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public FrameLayout setCameraLayout(int width, int height) {
     float newProportion = (float) width / (float) height;
     // Get the width of the screen
     int screenWidth =     this.customCameraActivity.getWindowManager().getDefaultDisplay()
            .getWidth();
     int screenHeight =    this.customCameraActivity.getWindowManager().getDefaultDisplay()
            .getHeight();
      float screenProportion = (float) screenWidth / (float) screenHeight;
      // Get the SurfaceView layout parameters
      ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)preview.getLayoutParams();
    

     if (newProportion > screenProportion) {
        lp.width = screenWidth;
        lp.height = (int) ((float) screenWidth / newProportion);
     } else {
        lp.width = (int) (newProportion * (float) screenHeight);
        lp.height = screenHeight;
    }
   
    //calculate the amount that takes to make it full screen (in the `height` parameter)
    float propHeight = screenHeight / lp.height;
   
    //make it full screen(
    lp.width = (int)(lp.width * propHeight);
    lp.height = (int)(lp.height * propHeight);

    frameLayout.setLayoutParams(lp);
    return frameLayout;

}

setCameraLayout呼叫者

OnCreate来自Activity和and surfaceChanged

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
                           int height) {
    if (getHolder().getSurface() == null) {
        return;
    }
    try {
        cameraManager.getCamera().stopPreview();
    } catch (Exception e) {
        // tried to stop a non-existent preview
    }

    try {
        Camera.Parameters cameraSettings = cameraManager.getCamera().getParameters();

        cameraSettings.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        this.cameraView.setCameraLayout(mPreviewSize.width, mPreviewSize.height);
        cameraManager.getCamera().setParameters(cameraSettings);
        cameraManager.getCamera().setPreviewDisplay(holder);

        cameraManager.getCamera().startPreview();
    } catch (Exception e) {
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}

目标

手机全屏摄像头预览。

问题所在

现在,我们得到的预览没有失真,这是好!和它有同样的height以及phone,这也是好!但是! preview的宽度比phone width (当然的)要大,所以相机的中心不是在手机的中心。我们已经考虑过的可能的解决办法:

  1. move的布局左到负位置,使预览中心在屏幕的中心。
  2. crop布局,并仅绘制new preview的中心,这对phone screens应该是可见的。

有什么办法克服这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-05 10:48:45

通过设置SurfaceView的重力,我成功地实现了预览的中心:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(wid, hei);
lp.gravity = Gravity.CENTER;
mSv.setLayoutParams(lp);

代码片段是从这里中提取的,如果您有耐心对其进行解密,欢迎您使用该代码。我想我是在解决类似的问题(预览旋转,扭曲,适应/填充)

祝好运。

票数 7
EN

Stack Overflow用户

发布于 2015-04-07 12:30:53

如果我从代码片段中理解,那么每次用户更改方向或旋转相机时,您都在重新实例化摄像机。有什么理由这么做吗?

为什么不限制预览仅限于肖像和有一个旋转的叠加视图?我很确定其他人也是这样(Instagram,Snapchat等等)做。如果我能找到的话,我会用这个例子编辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29352406

复制
相关文章
[译] 同时使用多个相机流 — Android 相机介绍
这篇文章是当前关于 Android 相机介绍中最新的一篇,我们之前介绍过相机阵列和相机会话和请求。
Android 开发者
2019/03/14
2.5K0
[译] 同时使用多个相机流 — Android 相机介绍
关于产品摄影的相机选择
作为专业摄影师或从事电子商务的商家,设备将是您进行产品摄影工作的必不可少的物品。通过价格选择优质的设备是大众最常用的方法之一,但是也可以凭借摄影过程中有效的基本知识,为产品摄影选择最佳的相机。我们在这里为您提供入门指南,其中列出了您需要了解的所有信息。
ORBITVU_欧保图
2022/06/30
6670
关于产品摄影的相机选择
机器视觉中如何选择工业相机与合适的相机镜头
相机和镜头是计算机视觉中重要的组成部分,合适的相机和镜头决定了系统的好坏。但是大部分的计算机视觉工程师对如何选择工业用相机和合适的镜头上犯了难。本文主要介绍如何选择相机与对应的镜头。
不脱发的程序猿
2021/01/20
1.7K0
Android相机快速使用
前言 摄像头是移动设备的重要工具。随着移动端技术的发展,摄像头作为移动设备的图像采集工具,也变得越来越重要。不论是AR特效,计算机视觉技术,都离不开摄像头稳定高效地工作。 由于摄像头可调参数极多,又涉及硬件厂商的各种兼容性。在Android中,这并不是一个简单的工作。本文只记录一种快速使用,能够简单的预览画面,录制视频。 快速开始 MainActivity.java public class MainActivity extends AppCompatActivity { SurfaceView
Oceanlong
2018/07/03
9810
干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」
三维成像技术原理和应用想必大家在之前的文章中了解过啦,今天想给大家比较一下LIDAR、ToF 相机以及双目相机,并且还有一些直观的测试数据来展示各自的优缺点,是骡子是马拉出来溜溜!
全栈程序员站长
2022/09/01
1.3K0
干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」
android之相机开发
在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机。 我将分别演示两种方式的使用:
全栈程序员站长
2022/07/20
8150
Android平台相机接口的应用
第一部分、前述: Android作为Google移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一企业目标的实现。Google的目标是让移动通信不依赖于设备,甚至是平台。出于这个目的,Android将完善而不是替代Google长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。 Android平台的研发队伍阵容强大,包括Google、HTC(宏达电)、T-Mobile、高通、摩托罗拉、三星、LG以及中国移动在
庞小明
2018/03/07
1.6K0
Android平台相机接口的应用
基于OpenGLES的Android相机预览
随着AR效果越来越普及,摄像头在Android中的应用越来越重要。通常摄像头的预览方案,通常使用SurfaceView的方案。
Oceanlong
2018/08/02
1.6K0
Android旋转相机拍摄的照片
前两天在做一个图片选择器的需求,其中的拍照部分要求调用系统相机拍照后允许用户逆时针旋转图片。
雪之下Perqin
2021/08/26
1.3K0
OpenGL ES for Android 相机预览
Android上打开摄像头需要camera权限,在Android 6.0及以上的版本需要动态申请权限,在`AndroidManifest.xml`中添加camera权限:
老孟Flutter
2020/09/11
1K0
android 自定义相机
老规矩,先上一下项目地址:GitHub:https://github.com/xiangzhihong/CameraDemo 方式: 调用Camera API 自定义相机 调用系统相机 由于需求不同,所以选择的方案固然也不同,至于第二种调用系统相机,这里就不过多讲解了,使用Intent对象设置一个Action动作即可,跳转时使用startActivityForResult,然后在onActivityResult处理相关数据便可,关键代码: intent.setAction("android.me
xiangzhihong
2018/02/01
3K0
android 自定义相机
Android相机开发那些坑
QQ空间开发团队
2016/10/24
29.6K8
Android相机开发那些坑
Android字符串相机
很早就看到过这种场景,用字符来展示图片甚至播放视频,可以说是黑客炫(zhuang)技(b)神器。当然有了一定的技术之后,就明白其实实现挺简单。
音视频开发进阶
2019/08/09
8550
android打开相机拍照及打开相册选择照片「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
1.8K0
Android调用相机与相册的方法
Android调用相机与相册的方法 操作流程 点击拍摄 效果图 点击相册选择 效果图 拒绝权限的情况 效果图 功能实现 项目配置 1.先在项目根目录的build.gradle的repositories添加: 2.在build.gradle(:app)的dependencies添加: 3.添加提示dialog样式 4.添加底部dialog样式 底部dialog弹出动画(dialog_in_anim.xml) 底部dialog关闭动画(dialog_out_anim.xml) 5.添加权限 6.在Android
是阿超
2022/08/07
2K0
Android调用相机与相册的方法
HALCON相机标定相机内参相机外参
如果大家看完这一篇文章后还想深入了解相机标定,可以参看文章《深入理解halcon相机标定》https://blog.csdn.net/cashmood/article/details/105221053
全栈程序员站长
2022/09/01
3.6K0
点击加载更多

相似问题

iOS全屏AVCaptureSessionPresetMedium相机

13

放大相机,同时保持文本锁定-相位3

16

Android选择图像或相机

13

相机意图在android上保持开放

20

铯飞相机定位但保持相机高度

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文