2012-05-15 10 views
16

Implemento una cámara integrada en la aplicación y cada vez que tomo una foto, mi imagen es de 320x240, aunque la cámara de mi teléfono es capaz de resoluciones mucho más altas (Galaxy Nexus). No pude encontrar un parámetro para establecer la resolución, entonces, ¿cómo puedo subir la resolución de las imágenes que estoy tomando? Aquí está el código relevante:¿Cómo se toman imágenes de alta resolución usando 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(); 
    } 
} 

Respuesta

29

Use params.setPictureSize(). Consulte Camera.Parameters para obtener más información.

Asegúrese de llamar al params.getSupportedPictureSizes() primero para obtener una variedad de tamaños de imagen admitidos. Luego, elija un tamaño de la lista y use el método setPictureSize() para establecer el tamaño deseado.

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

no saben cómo echaba de menos que uno. Gracias. –

+0

Funciona muy bien. ¡Gracias! – JustSoAmazing

+0

eres genio, trabajo genial finalmente encontré una solución usando esto después de 3 días –

2

Asegúrese de llamar a camera.getSupportedPictureSizes() primero para obtener una matriz de tamaños de imagen admitidos.

en realidad es 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); 
Cuestiones relacionadas