2011-07-20 48 views
10

在我的應用程序中,我能夠使用相機類運行代碼來拍照,但它使我的圖像尺寸爲2048 x 1536像素。Android相機圖像大小

當我使用我的android設備的默認相機時,它會給我2048 x 1232像素作爲圖像大小。

現在,問題是,如何讓我的應用程序在拍照時給我像默認相機(它是2048 x 1232)一樣的圖像尺寸?

我有這些代碼:

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> 

回答

5

把這段代碼

Parameters parameters = camera.getParameters(); 
parameters.set("jpeg-quality", 70); 
parameters.setPictureFormat(PixelFormat.JPEG); 
parameters.setPictureSize(2048, 1232); 
camera.setParameters(parameters); 
在surfaceCreated功能

調用

camera = Camera.open(); 

你找到了你的解決方案...

+17

你應該只使用可從getSupportedPictureSizes圖片尺寸()。使用其他任何可能會導致應用程序崩潰我已經看到了這個第一手。 –

+1

硬編碼圖片尺寸的不好主意:如果手機不支持該圖片尺寸,它很可能會崩潰。我們動態地設置圖片和預覽大小,甚至我們仍然有跨設備問題。 – AgentKnopf

0

連接 點擊here

CH點擊here

我在工作中遇到同樣的問題。 我用它來解決我的問題。

例如我用undercode我SurfaceView(CameraPreview)

 Camera.Parameters parameters = camera.getParameters(); 
     pictureSize = MyCamPara.getInstance().getPictureSize(
       parameters.getSupportedPictureSizes(), 800); 
     previewSize = MyCamPara.getInstance().getPreviewSize(
       parameters.getSupportedPreviewSizes(), getHeight()); 
     if (previewSize != null) 
      parameters 
        .setPreviewSize(previewSize.width, previewSize.height); 
     if (pictureSize != null) 
      parameters 
        .setPictureSize(pictureSize.width, pictureSize.height); 
     camera.setPreviewDisplay(holder); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
+0

它沒有爲我工作。 –