2011-07-20 15 views
10

W mojej aplikacji udało mi się uruchomić kod przy użyciu klasy kamery do robienia zdjęć, ale daje mi to 2048 x 1536 pikseli jako rozmiar obrazu.Rozmiar obrazu w aparacie z Androidem

Kiedy używam domyślnego aparatu mojego urządzenia z Androidem, daje mi to 2048 x 1232 pikseli jako rozmiar obrazu.

Teraz pytanie brzmi: w jaki sposób mogę sprawić, by moja aplikacja dała mi taki sam rozmiar obrazu, jak kamera domyślna (2048 x 1232), gdy robię zdjęcie?

mam te kody:

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> 

Odpowiedz

5

umieścić ten kod

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

w surfaceCreated funkcji po wywołaniu

camera = Camera.open(); 

znalazłeś rozwiązanie ...

+17

Należy używać tylko rozmiary zdjęć, które są dostępne od getSupportedPictureSizes(). Używanie czegokolwiek innego może spowodować awarię aplikacji. Widziałem to z pierwszej ręki. –

+1

Zły pomysł zakodowania rozmiaru obrazu: jeśli telefon nie obsługuje tego rozmiaru obrazu, najprawdopodobniej ulegnie awarii. Dynamicznie ustawiamy rozmiar obrazu i podglądu, a nawet nadal mamy problemy z różnymi urządzeniami. – AgentKnopf

0

pl Kliknij here

ch Kliknij here

Mam ten sam problem w mojej pracy. Używam tego do rozwiązania mojego problemu.

na przykład używać w moim SurfaceView Undercode (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

To nie działa dla mnie. –