2011-07-20 4 views
10

Dans mon application, j'ai pu exécuter un code en utilisant la classe de caméra pour prendre des photos, mais il me donne 2048 x 1536 pixels en taille d'image. Lorsque j'utilise l'appareil photo par défaut de mon appareil Android, il me donne 2048 x 1232 pixels en taille d'image.Appareil photo Android Taille de l'image

Maintenant, la question est, comment puis-je faire de mon application pour me donner la même taille d'image que la caméra par défaut (qui est de 2048 x 1232) quand je prends des photos?

Je ces 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> 

Répondre

5

mettre ce code

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

dans votre fonction surfaceCreated après avoir appelé

camera = Camera.open(); 

vous avez trouvé votre solution ...

+17

Vous ne devez utiliser les formats d'image disponibles à partir getSupportedPictureSizes(). En utilisant n'importe quoi d'autre peut planter l'application. J'ai vu cette première main. –

+1

Mauvaise idée de coder en dur la taille de l'image: Si un téléphone ne prend pas en charge cette taille d'image, il risque fort de tomber en panne. Nous définissons dynamiquement la taille de l'image et de l'aperçu et même avec cela nous avons toujours des problèmes inter-appareils. – AgentKnopf

0

en Cliquez here

ch Cliquez here

J'ai le même problème dans mon travail. Je l'utilise pour résoudre mon problème.

par exemple j'utiliser Undercode dans mon 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

Ça n'a pas marché pour moi. –