2011-07-20 52 views
10

Trong ứng dụng của mình, tôi có thể chạy mã bằng cách sử dụng lớp máy ảnh để chụp ảnh, nhưng nó mang lại cho tôi 2048 x 1536 pixel làm kích thước hình ảnh.Kích thước hình ảnh của máy ảnh Android

Khi tôi sử dụng máy ảnh mặc định của thiết bị Android, nó cho tôi 2048 x 1232 pixel làm kích thước hình ảnh.

Bây giờ, câu hỏi là, làm thế nào tôi có thể làm cho ứng dụng của tôi cung cấp cho tôi cùng kích thước hình ảnh như máy ảnh mặc định (2048 x 1232) khi chụp ảnh?

tôi có các mã:

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> 

Trả lời

13

Bạn có thể sử dụng setPictureSize() trên các thông số máy ảnh đối tượng để cấu hình kích thước của ảnh chụp:

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

Nói chung đầu tiên bạn nên gọi getSupportedPictureSizes() để chắc chắn rằng bạn' yêu cầu độ phân giải mà phần cứng hỗ trợ, nhưng có vẻ như bạn đã biết kích thước.

5

đặt mã này

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

chức năng surfaceCreated của bạn sau khi gọi

camera = Camera.open(); 

bạn đã tìm thấy giải pháp của bạn ...

+17

Bạn chỉ nên sử dụng kích thước hình ảnh mà có sẵn từ getSupportedPictureSizes(). Sử dụng bất kỳ thứ gì khác có thể làm hỏng ứng dụng. Tôi đã thấy bàn tay đầu tiên này. –

+1

Ý tưởng tồi khó mã hóa kích thước hình ảnh: Nếu điện thoại không hỗ trợ kích thước hình ảnh đó, nhiều khả năng sẽ bị lỗi nhất. Chúng tôi tự động đặt kích thước hình ảnh và xem trước và ngay cả khi chúng tôi vẫn gặp sự cố thiết bị chéo. – AgentKnopf

0

en Bấm here

ch Nhấn here

Tôi có cùng một vấn đề trong công việc của mình. Tôi sử dụng nó để giải quyết vấn đề của mình.

ví dụ tôi sử dụng undercode trong SurfaceView tôi (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

Nó không hiệu quả với tôi. –

Các vấn đề liên quan