2012-05-15 3 views
16

Ich implementiere eine In-App-Kamera und jedes Mal, wenn ich ein Bild mache, ist mein Bild 320x240, obwohl die Kamera meines Telefons viel höhere Auflösungen (Galaxy Nexus) kann. Ich konnte keinen Parameter zum Einstellen der Auflösung finden. Wie kann ich die Auflösung der Bilder, die ich aufgenommen habe, erhöhen? Hier ist der entsprechende Code:Wie nehmen Sie Bilder mit hoher Auflösung mit 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(); 
    } 
} 

Antwort

29

Verwenden Sie params.setPictureSize(). Weitere Informationen finden Sie unter Camera.Parameters.

Stellen Sie sicher, dass Sie zuerst params.getSupportedPictureSizes() anrufen, um eine Reihe von unterstützten Bildgrößen zu erhalten. Wählen Sie dann eine Größe aus der Liste und verwenden Sie die Methode setPictureSize(), um die gewünschte Größe festzulegen.

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

Sie wissen nicht, wie ich das verpasst. Vielen Dank. –

+0

Funktioniert gut. Vielen Dank! – JustSoAmazing

+0

Sie sind Genie Arbeit groß endlich fand ich eine Lösung mit dieser nach 3 Tagen –

2

Stellen Sie sicher, dass Sie camera.getSupportedPictureSizes() zuerst aufrufen, um eine Reihe von unterstützten Bildgrößen zu erhalten.

Eigentlich ist 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);