Android摄像头图像大小 [英] Android Camera Image Size

查看:211
本文介绍了Android摄像头图像大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序,我可以用相机类拍照运行code,但它给了我2048×1536像素的图像大小。

当我用我的Andr​​oid设备的默认的摄像头,它给了我2048×1232像素的图像大小。

现在的问题是,怎样才能让我的应用程序,给我相同的图像尺寸喜欢默认的摄像头(这是2048×1232),当我拍照?

我的这些codeS:

CameraActivity.java

 公共类CameraActivity延伸活动{
    私有静态最后字符串变量=CameraDemo;
    preVIEW preVIEW; //&其中1为卤素;
    的FrameLayout buttonClick; // 2>

    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.camera);

        Toast.makeText(getBaseContext(),触摸屏幕拍照。Toast.LENGTH_SHORT).show();

        preVIEW =新的preVIEW(本); //&其中3的密度;
        ((的FrameLayout)findViewById(R.id. preVIEW))addView(preVIEW)。 //&所述; 4为H.

        // buttonClick =(按钮)findViewById(R.id.buttonClick);

        buttonClick =(的FrameLayout)findViewById(R.id. preVIEW);

        buttonClick.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){//小于5>
                preview.camera.takePicture(shutterCallback,rawCallback,jpegCallback);
            }
        });

        Log.d(TAG,onCreate'd);
    }

    //当快门打开时调用
    ShutterCallback shutterCallback =新ShutterCallback(){//&其中; 6个
        公共无效onShutter(){
            Log.d(TAG,onShutter'd);
        }
    };

    //处理对原始图像数据
    PictureCallback rawCallback =新PictureCallback(){//&其中7个;
        公共无效onPictureTaken(byte []的数据,摄像头摄像头){
            Log.d(TAG,onPictureTaken  - 生);
        }
    };


    //处理数据的JPEG图片
    PictureCallback jpegCallback =新PictureCallback(){//&所述8是氢;
        公共无效onPictureTaken(byte []的数据,摄像头摄像头){


            FileOutputStream中outStream = NULL;
            尝试 {

                //写入SD卡
                outStream =新的FileOutputStream(
                    的String.Format(
                            Environment.getExternalStorageDirectory()+/ Engagia / AudienceImages /+ CameraActivity.this.sessionNumber +.JPG,
                            System.currentTimeMillis的()
                    )); //&其中9个;

                outStream.write(数据);
                outStream.close();

                Toast.makeText(getBaseContext(),preVIEW,Toast.LENGTH_SHORT).show();


                Log.d(TAG,onPictureTaken  - 写字节:+ data.length);
            }赶上(FileNotFoundException异常E){//小于10>
                e.printStackTrace();
            }赶上(IOException异常E){
                e.printStackTrace();
            } 最后 {

            }
            Log.d(TAG,onPictureTaken  -  JPEG);
        }
    };
}
 

preview.java

 包com.first.Engagia;

进口java.io.IOException异常;

进口android.content.Context;
进口android.hardware.Camera;
进口android.hardware.Camera previewCallback。
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;

类preVIEW延伸SurfaceView实现SurfaceHolder.Callback {//&其中1为卤素;
    私有静态最后字符串变量=preVIEW;

    SurfaceHolder mHolder; // 2>
    公共摄像头摄像头; //&其中3的密度;

    preVIEW(上下文的背景下){
        超(上下文);

        //安装SurfaceHolder.Callback所以我们得到通知时,该
        //下垫面创建和销毁。
        mHolder = getHolder(); //&所述; 4为H.
        mHolder.addCallback(本); //&其中5个;
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //&其中; 6个
    }


    //调用一次支架已准备就绪
    公共无效surfaceCreated(SurfaceHolder持有者){//&其中7个;
        //表面经创建,获取摄像机,并告诉它在哪里
        //绘制。
        相机= Camera.open(); //&其中8是氢;
        尝试 {
            camera.set previewDisplay(保持器); //&其中9个;

            camera.set previewCallback(新previewCallback(){//小于10>

                //呼吁每一帧previewed
                在previewFrame(byte []的数据,摄像头摄像头){//&LT公共无效; 11>
                    Log.d(关于previewFrame所谓的标签+ System.currentTimeMillis的());
                    preview.this.invalidate(); //&其中12所取代;
                }

            });
        }赶上(IOException异常E){//< 13>
            e.printStackTrace();
        }
    }

  //当支架被破坏时调用
  公共无效surfaceDestroyed(SurfaceHolder持有者){//&所述14取代;
    camera.stop preVIEW();
    摄像头= NULL;
  }

  //调用时,持有人已变更
  公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){//< 15>
    camera.start preVIEW();
  }

}
 

main.xml中:

 < XML版本=1.0编码=UTF-8&GT?;
<的FrameLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:ID =@ + ID / preVIEW
机器人:layout_width =match_parent
机器人:layout_height =match_parent>

<按钮机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT机器人:ID =@ + ID / buttonClick
机器人:文本=点击
机器人:layout_gravity =右|底/>

< /的FrameLayout>
 

解决方案

您可以在相机参数使用setPictureSize()对象来配置捕获尺寸:

<一个href="http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPictureSize(int">http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPictureSize(int, INT)

一般来说首先你应该调用getSupportedPictureSizes()来确保你问的是,硬件支持的分辨率,但听起来就像你已经知道的大小。

In my app, I was able to run a code using the camera class to take pictures, but it gives me 2048 x 1536 pixels as the image size.

When I use the default camera of my android device, it gives me 2048 x 1232 pixels as the image size.

Now, the question is, how can I make my app to give me the same image size like the default camera (which is 2048 x 1232) when I take picture?

I have these codes:

CameraActivity.java

public class CameraActivity extends Activity {
    private static final String TAG = "CameraDemo";
    Preview preview; // <1>
    FrameLayout buttonClick; // <2>

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);

        Toast.makeText(getBaseContext(), "Touch the screen to take picture.", Toast.LENGTH_SHORT).show();

        preview = new Preview(this); // <3>
        ((FrameLayout) findViewById(R.id.preview)).addView(preview); // <4>

        //buttonClick = (Button) findViewById(R.id.buttonClick);

        buttonClick = (FrameLayout) findViewById(R.id.preview);

        buttonClick.setOnClickListener(new OnClickListener() {
            public void onClick(View v) { // <5>
                preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
        });

        Log.d(TAG, "onCreate'd");
    }

    // Called when shutter is opened
    ShutterCallback shutterCallback = new ShutterCallback() { // <6>
        public void onShutter() {
            Log.d(TAG, "onShutter'd");
        }
    };

    //Handles data for raw picture
    PictureCallback rawCallback = new PictureCallback() { // <7>
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d(TAG, "onPictureTaken - raw");
        }
    };


    // Handles data for jpeg picture
    PictureCallback jpegCallback = new PictureCallback() { // <8>
        public void onPictureTaken(byte[] data, Camera camera) {


            FileOutputStream outStream = null;
            try {

                //Write to SD Card
                outStream = new FileOutputStream(
                    String.format(
                            Environment.getExternalStorageDirectory() + "/Engagia/AudienceImages/" + CameraActivity.this.sessionNumber + ".jpg",
                            System.currentTimeMillis()
                    )); // <9>

                outStream.write(data);
                outStream.close();

                Toast.makeText(getBaseContext(), "Preview", Toast.LENGTH_SHORT).show();


                Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
            } catch (FileNotFoundException e) { // <10>
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

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

Preview.java

package com.first.Engagia;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback { // <1>
    private static final String TAG = "Preview";

    SurfaceHolder mHolder;  // <2>
    public Camera camera; // <3>

    Preview(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();  // <4>
        mHolder.addCallback(this);  // <5>
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6>
    }


    //Called once the holder is ready
    public void surfaceCreated(SurfaceHolder holder) {  // <7>
        // The Surface has been created, acquire the camera and tell it where
        // to draw.
        camera = Camera.open(); // <8>
        try {
            camera.setPreviewDisplay(holder);  // <9>

            camera.setPreviewCallback(new PreviewCallback() { // <10>

                // Called for each frame previewed
                public void onPreviewFrame(byte[] data, Camera camera) {  // <11>
                    Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis());
                    Preview.this.invalidate();  // <12>
                }

            });
        } catch (IOException e) { // <13>
            e.printStackTrace();
        }
    }

  // Called when the holder is destroyed
  public void surfaceDestroyed(SurfaceHolder holder) {  // <14>
    camera.stopPreview();
    camera = null;
  }

  // Called when holder has changed
  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // <15>
    camera.startPreview();
  }

}

Main.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/preview" 
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonClick"
android:text="Click"
android:layout_gravity="right|bottom" />

</FrameLayout>

解决方案

You can use setPictureSize() on the camera parameters object to configure the size of the capture:

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPictureSize(int, int)

Generally speaking first you should call getSupportedPictureSizes() to make sure you're asking for a resolution that the hardware supports, but sounds like you already know the sizes.

这篇关于Android摄像头图像大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆