自制Camera例子——更改摄像头预览大小

原创 2016年05月30日 11:36:35
我们仍然通过Camera.Parameters去修改摄像头的属性。
parameter.setPreviewSize(w,h) 去修改显示大小。
注意:里面的w,h并不是随意书写的,也是要手机的相机支持才行。否则重置parameter的时候会失败。所以我们在修改Camera显示大小的时候,还是要首先获取当前手机所支持的显示大小列表列表,然后再从列表中遍历获取跟我们指定大小最合适(根据需求而定)的一组值就可以了。
MainActivity:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    //Camera显示最大宽度
    public static final int MAX_W = 200;
    //Camera显示最大高度
    public static final int MAX_H = 200;

    private SurfaceView camera_view;
    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        camera_view = (SurfaceView) findViewById(R.id.camera_view);
        SurfaceHolder holder = camera_view.getHolder();
        holder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
        try {
            Camera.Parameters parameters = camera.getParameters();

            //设置显示试图,显示视图
            if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                //设置相机方向,钟祥
                parameters.set("orientation", "portrait");

                camera.setDisplayOrientation(90);
                //对于Android 2.2及以上版本
                parameters.setRotation(90);
            } else {
                //横向
                parameters.set("orientation", "landscape");
                camera.setDisplayOrientation(0);
                //对于Android 2.2及以上版本
                parameters.setRotation(90);
            }

            //设置Carema显示大小
            //当前最适合的宽度
            int bestW = 0;
            //当前最适合的高度
            int bestH = 0;
            //获取相机所有支持的显示大小列表
            List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
            if (sizes != null && sizes.size() > 0) {
                Iterator<Camera.Size> cel = sizes.iterator();
                while (cel.hasNext()) {
                    Camera.Size size = cel.next();
                    /**
                     * 根据需求修改最合适的款、高
                     * 这里选择的是:当前大小大于最佳大小,但小于设定的上限就修改
                     */
                    if (size.width > bestW && size.width < MAX_W &&
                            size.height > bestH && size.height < MAX_H) {
                        bestW = size.width;
                        bestH = size.height;
                    }
                }
            }

            //当最佳值都不为0的时候,修改显示大小
            if (bestW != 0 && bestH != 0) {
                parameters.setPreviewSize(bestW, bestH);
		//修改SurfaceView显示视图大小
		ViewGroup.LayoutParams params = camera_view.getLayoutParams();
		params.width = bestW;
		params.height = bestH;
	      camera_view.setLayoutParams(params);
} camera.setParameters(parameters); camera.setPreviewDisplay(holder); } catch (Exception e) { camera.release(); e.printStackTrace(); } camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); ; camera.release(); camera = null; } @Override protected void onDestroy() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } super.onDestroy(); }}XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.my.camerademo.MainActivity"
    tools:showIn="@layout/activity_main">

    <SurfaceView
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>
Demo下载

Android 修改Camera默认preview size预览大小为4:3

在CameraSettings.java (alps\packages\apps\camera\src\com\android\camera) 目前版本 previewsize的 默认值是全屏,如果...

Camera预览尺寸和获取屏幕宽高。

算法需要将预览大小与手机的分辨率挂钩,才能够在不同分辨率的手机上面预览都不变形。 /** * 获取最佳预览大小 * @param parameters 相机参数 * @param sc...

Android camera预览参数以及实际图像大小设置

参考一下两篇博文: http://www.cnblogs.com/skyseraph/archive/2012/03/26/2418665.html http://blog.csdn.net/y...

摄像头

一、OmniVision SCCB总线介绍        1.1、简介            Omnivision 公司制定了Serial Camera Control Bus(SCCB)总线协议...

多媒体编程——绘制图像

多媒体编程——绘制图像 首先来说,最常见的图像文件类型有bmp,jpg,png等等。每一种都有他们各自文件格式和特点。 但是对于多媒体级别的图像来说(硬件加速连续快速的渲染不同的图像),这...

Android实例讲解自定义Camera拍照和预览以及前后置摄像头切换

本博文将通过实例实现自定义Camera的功效。具体功能如下: 1.实现自定义Camera拍照; 2.实现前后置摄像头的切换; 3.实现Camera拍照后图片缩小显示以及正常预览; ...

Android Camera开发:给摄像头预览界面加个ZoomBar(附完整代码下载)

原文地址:http://www.cnblogs.com/android100/p/Android-Camera.html

Camera2.0新API下的摄像头预览、原始图像数据获取等

最近刚入职了一家公司,这家公司是做人眼虹膜识别的,所以用到的主要就是Camera相关的知识,公司之前的产品都是基于Camera1,公司就派我去了解研究Camera2。这里我就写下这10天左右我对Cam...

Android Camera2.0 API实现摄像头预览并获取人脸关键坐标

Android 5.0(API Level 21)以后推出了新的camera2.0 API,原有的Camera1.0已被废弃,确实新的camera API有更好的架构,更低的耦合,可以使开发人员发挥更...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自制Camera例子——更改摄像头预览大小
举报原因:
原因补充:

(最多只允许输入30个字)