相关疑难解决方法(0)

全屏相机显示/预览不保持纵横比 - 图像歪斜,拉伸以适合屏幕

我开发了一个小应用程序,用于全屏显示摄像头预览.我正在使用Camera API.

这是活动布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <!-- This is the container for the camera preview screen -->
    <FrameLayout android:id="@+id/camera_preview"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

当设备处于纵向状态时,显示器将垂直缩放以匹配设备屏幕的高度 - 因此纵横比与本机相机的纵横比不同.这些是2张图片,更好地解释了我所说的内容:

在此输入图像描述在此输入图像描述

第一张图像是使用原生相机设备制作的.第二张图片是用我的应用程序制作的,相机全屏 - 图像歪斜,拉伸以适应屏幕.

无论getSupportedPreviewSizes()mehod 提供的预览尺寸和无失真,我都需要将相机预览设置为全屏.有没有办法实现这个目标?当相机预览全屏时,有没有办法保持适当的宽高比?我希望这可以通过操作系统自动完成 - 裁剪图像以匹配所请求的分辨率,同时保持宽高比,但这不会发生.

我试图使SurfaceView显示器大于显示器(遵循这个问题:将相机预览适合大于显示器的SurfaceView),但在我的情况下不行,因为我捕获快照(6帧/秒)和那些不是用户在屏幕上看到的内容(框架包含所有相机预览,即使并非所有相机都在屏幕上可见).

我在这里发布:https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v = 0mcn我做的整个项目.

任何想法/解决方案对我来说都非常重要.非常感谢.

================================================== ======================

由于ss1271答案更新:

我将分析你为三星Galaxy Ace II上面写的一些分辨率.

I.屏幕分辨率:480x800 - 宽高比3:5 = 0,6

II.getSupportedPreviewSizes - 我几乎可以肯定这些值来自后置摄像头.以下是这些决议的方面比率:

   2560x1920   - 0,75

   2560x1536   - 0,60

   2048x1536   - 0,75

   2048x1232   - …
Run Code Online (Sandbox Code Playgroud)

android android-camera

31
推荐指数
1
解决办法
4万
查看次数

将相机预览适合大于显示器的SurfaceView

我有一个Android应用程序需要全屏一个摄像头预览,无论预设大小getSupportedPreviewSizes()没有失真.我希望这可以在高度或宽度上裁剪一些预算,但这并不关心我.我寻求这样做的原因是因为某些安卓摄像头(例如三星Galaxy SII前置摄像头)不会返回任何与显示器具有相同宽高比的预览,因此需要拉伸和剪裁.

是否可以将相机预览完全增加到大于显示尺寸的视图?通过简单地将曲面视图的布局参数设置为match_parent,可以使SurfaceView大于返回的预览像素尺寸,但这会导致某些方向的失真,并且只有在预览填充显示之前才可能.这似乎表明在显示器外部进行预览是不可能的,并且硬件(或OS)限制了这种行为.

关于这个主题还有另一个问题,但是这个问题声称不可能创建一个大于屏幕尺寸的SurfaceView,这是错误的,正如我在日志记录中发现的那样.然而,似乎情况是相机预览无法增长到庞大的SurfaceView的全尺寸.

我的尝试:

我有一个相对布局,在它内部是一个FrameLayout,在其中我创建了一个SurfaceView.整个相对布局的宽度设置在635dp以下,这是设备屏幕尺寸的两倍.FrameLayout匹配此大小,SurfaceView也是如此(稍后以编程方式添加)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/camera_activity_layout"
    android:layout_width="635dp"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

以下是获取和设置预览大小的代码.在这里,我想让相机预览展开以填充整个FrameLayout(屏幕宽度的两倍).视图完全正常显示和破坏,因此我删除与此特定问题无关的代码,因为它分散了基本问题,并且我尝试轻松简单地将视图扩展为大于显示大小的视图.

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

    ...

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Camera.Parameters parameters = mCamera.getParameters();
        final DisplayMetrics dm = this.getResources().getDisplayMetrics();
            //getBestPreviewSize returns the best preview size, don't worry
            //but some devices do not return one for all camera matching the aspect ratio
        cameraSize = getBestPreviewSize(parameters, dm.heightPixels, dm.widthPixels); …
Run Code Online (Sandbox Code Playgroud)

android surfaceview android-layout android-camera

23
推荐指数
1
解决办法
2万
查看次数

CropView的裁剪相机预览

我有一个固定宽度和高度的TextureView,我想在其中显示相机预览.我需要裁剪相机预览,以便它看起来不会在我的TextureView中拉伸.怎么做种植?如果我需要使用OpenGL,如何将Surface Texture绑定到OpenGL以及如何使用OpenGL进行裁剪?

public class MyActivity extends Activity implements TextureView.SurfaceTextureListener 
{

   private Camera mCamera;
   private TextureView mTextureView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_options);

    mTextureView = (TextureView) findViewById(R.id.camera_preview);
    mTextureView.setSurfaceTextureListener(this);
}

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
    mCamera = Camera.open();

    try 
    {
        mCamera.setPreviewTexture(surface);
        mCamera.startPreview();
    } catch (IOException ioe) {
        // Something bad happened
    }
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    mCamera.stopPreview();
    mCamera.release();
    return true;
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
} …
Run Code Online (Sandbox Code Playgroud)

android opengl-es android-camera textureview

23
推荐指数
3
解决办法
3万
查看次数

纵向模式下的相机setDisplayOrientation()打破纵横比

我试图让相机预览在纵向模式下正常工作,其中活动本身可以正常改变方向(即,不被锁定到风景).

但是,使用setDisplayOrientation()严重打破了预览的行为.

这可以通过谷歌自己的ApiDemos来证明.第一个图像基于示例项目CameraPreviewandroid-17版本ApiDemos,其中我做的唯一更改是android:orientation="landscape"从清单中的此活动的条目中删除.下图是运行Android 4.2的Nexus 4显示屏上显示的内容的屏幕截图,相机指向一张8.5平方英寸的纸张:

Nexus 4 ApiDemos预览,纵向模式

该预览中不明显的是它旋转了90度.您在图像最右侧看到的袜子包裹的脚实际上位于正方形下方.

对此,至少对于横向模式,解决方案是使用setDisplayOrientation().但是,如果修改了Preview内部类的CameraPreviewmCamera.setDisplayOrientation(90);,你会得到这样的:

Nexus 4 ApiDemos预览,纵向模式,带setDisplayOrientation(90)

值得注意的是,广场不再是正方形.

它使用与SurfaceView以前相同的大小.我已经使用其他一些代码重现了这个场景ApiDemos,并且我TextureView在该代码中得到了相同的行为.

我简单地想到问题可能是getSupportedPreviewSizes()基于可能会返回不同的值setDisplayOrientation(),但快速测试表明情况并非如此.

任何人都知道如何setDisplayOrientation()在纵向模式下工作而不会破坏图像的宽高比推到预览中?

谢谢!

android android-camera

15
推荐指数
1
解决办法
1万
查看次数

是否可以裁剪相机预览?

我没有找到任何方法来裁剪相机ppreview,然后在SurfaceView上显示它.

Android - 可以裁剪相机预览吗?

android android-camera

14
推荐指数
3
解决办法
2万
查看次数

更改Android自定义SurfaceView的大小

我正在尝试为Android应用程序创建2D游戏引擎.我已经按照本教程,它可以很好地创建一个全屏显示,但我不希望这样.我想让我的视图占据屏幕的前2/3(或其他),并使用标准的Android小部件(按钮,文本输入等)填充底部的第三个.我不能让这个工作.我能得到的最好的是一个空白的白色屏幕.我尝试了很多排列,包括使用外部LinerLayout,然后将自定义SurfaceView嵌入到嵌套的RelativeLayout中,并将Android小部件放在嵌套的LinearLayout中,它不起作用.

例如,当我觉得它应该是50%SurfaceView时,这会产生一个白色屏幕,对于TextView,它会产生50%:

activity_main.xml中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false" >

<RelativeLayout
    android:layout_width="0dip"
    android:layout_height="0dp"
    android:layout_weight="1"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapContainer"
    >
</RelativeLayout> 

<LinearLayout
    android:layout_width="0dip" 
    android:layout_weight="1"
    android:layout_height="0dp"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="@color/white"
        android:text="@string/test_str" />
</LinearLayout>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java:

package com.removed.for.privacy;

import com.removed.for.privacy;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout mapContainer = (RelativeLayout) findViewById(R.id.mapContainer);

        JSMapView mapView = new JSMapView(this);
        mapContainer.addView(mapView);

    }

    @Override
    public boolean …
Run Code Online (Sandbox Code Playgroud)

android 2d surfaceview surfaceholder

3
推荐指数
1
解决办法
6297
查看次数