2012-05-15 25 views
16

Wdrażam kamerę w aplikacji i za każdym razem, gdy robię zdjęcie, mój obraz ma wymiary 320 x 240, chociaż aparat mojego telefonu ma znacznie większą rozdzielczość (Galaxy Nexus). Nie mogłem znaleźć parametru do ustawienia rozdzielczości, więc jak mogę poprawić rozdzielczość zdjęć, które robię? Oto odpowiedni kod:Jak zrobić zdjęcia w wysokiej rozdzielczości za pomocą funkcji 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(); 
    } 
} 

Odpowiedz

29

Użyj params.setPictureSize(). Aby uzyskać więcej informacji, zobacz Camera.Parameters.

Upewnij się, że najpierw dzwonisz pod numer params.getSupportedPictureSizes(), aby uzyskać tablicę obsługiwanych rozmiarów zdjęć. Następnie wybierz rozmiar z listy i użyj metody setPictureSize(), aby ustawić żądany rozmiar.

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

Nie wiem jak brakowało mi tego. Dzięki. –

+0

Działa świetnie. Dzięki! – JustSoAmazing

+0

twoje genius działa świetnie, wreszcie znalazłem rozwiązanie, które używa tego po 3 dniach –

2

Upewnij się, że najpierw wywołasz metodę camera.getSupportedPictureSizes(), aby uzyskać tablicę obsługiwanych rozmiarów zdjęć.

Właściwie to 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); 
Powiązane problemy