Android摄像头图像大小 [英] Android Camera Image Size
问题描述
在我的应用程序,我可以用相机类拍照运行code,但它给了我2048×1536像素的图像大小。
当我用我的Android设备的默认的摄像头,它给了我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:机器人=http://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屋!