2012-05-15 28 views
16

Tôi đang triển khai máy ảnh trong ứng dụng và mỗi khi chụp ảnh, hình ảnh của tôi là 320x240, mặc dù máy ảnh của điện thoại của tôi có khả năng phân giải cao hơn nhiều (Galaxy Nexus). Tôi không thể tìm thấy thông số để thiết lập độ phân giải, vậy làm cách nào để tôi giải quyết hình ảnh tôi đang chụp? Đây là mã có liên quan:Làm cách nào để chụp ảnh có độ phân giải cao bằng Camera.takePicture()?

@Override 
public void surfaceCreated(SurfaceHolder holder) { 

    setSurfaceHolder(holder); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

    setSurfaceHolder(null); 
} 

private void attachCameraToSurface(Camera camera, SurfaceHolder holder) { 

    try { 
     camera.setPreviewDisplay(holder); 
     setInPreview(true); 
    } 
    catch (IOException e) { 
     Log.e("CameraFragment", "Exception in attachCameraToSurface()", e); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    Camera camera = getCamera(); 
    if (camera == null) { 
     return; 
    } 

    Camera.Size size = getCameraPreviewSize(camera); 
    Camera.Parameters params = camera.getParameters(); 
    params.setPreviewSize(size.width, size.height); 
    camera.setParameters(params); 

    attachCameraToSurface(camera, holder); 

    startPreview(); 
} 

private Camera.Size getCameraPreviewSize(Camera camera) { 

    Camera.Parameters params = camera.getParameters(); 
    List<Camera.Size> supportedSizes = params.getSupportedPreviewSizes(); 

    Rect frame = getSurfaceHolder().getSurfaceFrame(); 
    int width = frame.width(); 
    int height = frame.height(); 

    for (Camera.Size size : supportedSizes) { 
     if (size.width >= width || size.height >= height) { 
      return size; 
     } 
    } 

    return supportedSizes.get(0); 
} 

@Override 
public void onClick(View v) { 

    switch (v.getId()) { 
     case R.id.camera_action_ImageView: 
      getCamera().takePicture(getShutterCallback(), null, new JpegPictureCallback()); 
     break; 
    } 
} 

private class JpegPictureCallback implements PictureCallback { 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     Bitmap bitmap = null; 
     try { 
      bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     } 
     catch (OutOfMemoryError e) { 
      Log.e("CameraFragment", "Out of memory decoding image from camera.", e); 
      return; 
     } 
     data = null; 

     if (bitmap != null) { 
      new SavePictureWorker(getActivity()).execute(bitmap); 
     } 

     startPreview(); 
    } 
} 

Trả lời

29

Sử dụng params.setPictureSize(). Xem Camera.Parameters để biết thêm thông tin.

Đảm bảo rằng bạn gọi params.getSupportedPictureSizes() trước tiên để nhận được một loạt các kích thước hình ảnh được hỗ trợ. Sau đó chọn kích thước từ danh sách và sử dụng phương thức setPictureSize() để đặt kích thước mong muốn.

Camera.Parameters params = camera.getParameters(); 
List<Camera.Size> supportedSizes = params.getSupportedPictureSizes(); 
. 
. 
Camera.Size sizePicture = (one of the sizes from supportedSizes list); 
. 
params.setPictureSize(sizePicture.width, sizePicture.height); 
+0

Không biết làm thế nào tôi bị mất rằng một. Cảm ơn. –

+0

Hoạt động tuyệt vời. Cảm ơn! – JustSoAmazing

+0

bạn là thiên tài làm việc tuyệt vời cuối cùng tôi tìm thấy một giải pháp sử dụng sau 3 ngày –

2

Đảm bảo rằng bạn gọi camera.getSupportedPictureSizes() trước tiên để nhận được một loạt các kích thước hình ảnh được hỗ trợ.

Trên thực tế nó là params.getSupportedPictureSizes();

9
Camera.Parameters param; 
param = camera.getParameters(); 

Camera.Size bestSize = null; 
List<Camera.Size> sizeList = camera.getParameters().getSupportedPreviewSizes(); 
bestSize = sizeList.get(0); 
for(int i = 1; i < sizeList.size(); i++){ 
    if((sizeList.get(i).width * sizeList.get(i).height) > (bestSize.width * bestSize.height)){ 
     bestSize = sizeList.get(i); 
    } 
} 

List<Integer> supportedPreviewFormats = param.getSupportedPreviewFormats(); 
Iterator<Integer> supportedPreviewFormatsIterator = supportedPreviewFormats.iterator(); 
while(supportedPreviewFormatsIterator.hasNext()){ 
    Integer previewFormat =supportedPreviewFormatsIterator.next(); 
    if (previewFormat == ImageFormat.YV12) { 
     param.setPreviewFormat(previewFormat); 
    } 
} 

param.setPreviewSize(bestSize.width, bestSize.height); 

param.setPictureSize(bestSize.width, bestSize.height); 

camera.setParameters(param); 
camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
0
Camera.Parameters parameters = camera.getParameters(); 
      List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 
      int w = 0, h = 0; 
      for (Camera.Size size : sizes) { 
       if (size.width > w || size.height > h) { 
        w = size.width; 
        h = size.height; 
       } 

      } 
      parameters.setPictureSize(w, h); 
Các vấn đề liên quan