2014-11-16 7 views
11

staram się robić zdjęcia bezpośrednio za pomocą interfejsu API aparatu, ale to jest podgląd mam: enter image description hereAndroid: Zrobione zdjęcie jest większe niż na podglądzie

& to zdjęcie wykonane po wywołaniu takePicture() który jest większy niż samego podglądu:

enter image description here

(uwaga: ja przycięte wysokość poprzednich 2 zdjęć w celu zwiększenia czytelności zapytania, & przechowywane szerokość jak jest)

Używam tej metody użytkową wybrać najlepszy optymalny rozmiar podglądu przed rozpoczęciem podglądu kamery:

public static Camera.Size getBestAspectPreviewSize(int displayOrientation, 
                int width, 
                int height, 
                Camera.Parameters parameters) { 
    double targetRatio = (double) width/height; 
    Camera.Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 
    if (displayOrientation == 90 || displayOrientation == 270) { 
     targetRatio = (double) height/width; 
    } 
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
    Collections.sort(sizes, 
      Collections.reverseOrder(new SizeComparator())); 
    for (Camera.Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(ratio - targetRatio); 
     } 
     if (minDiff < 0.0d) { 
      break; 
     } 
    } 
    return (optimalSize); 
} 

& tej metody, aby wybrać odpowiedni rozmiar obrazu:

public static Camera.Size getBiggestSafePictureSize(Camera.Parameters parameters) { 
    Camera.Size result = null; 
    long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
    long availableMemory = Runtime.getRuntime().maxMemory() - used; 
    for (Camera.Size size : parameters.getSupportedPictureSizes()) { 
     int newArea = size.width * size.height; 
     long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :)) 
     if (neededMemory > availableMemory) 
      continue; 
     if (result == null) { 
      result = size; 
     } else { 
      int resultArea = result.width * result.height; 
      if (newArea > resultArea) { 
       result = size; 
      } 
     } 
    } 
    return (result); 
} 

& To jest element podglądu kamery w układzie:

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/cameraPreview"></FrameLayout> 

& Podążam za the official documentation, aby utworzyć sam podgląd kamery.

A więc, jak wymusić podgląd kamery, aby pokazać dokładnie zdjęcie, które zostanie zrobione?

Odpowiedz

16

Wreszcie znalazłem to :)

według tego answer & cytuję:

Podczas gdy typowy aparat jest 4: 3 aspekt, podgląd może być także dostępny w 5 : Współczynniki 3 i 16: 9 i wydaje się, że osiągnięto to przez faktyczne wydłużenie horyzontalnego pola widzenia ...

Musimy więc znaleźć podgląd ZE & rozmiar obrazu, zarówno z 4: 3 współczynnik proporcji, aby móc w pełni wykorzystać kąt kamery, więc zmieniłem mój kod tak:

public static Camera.Size determineBestPreviewSize(Camera.Parameters parameters) { 
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
    return determineBestSize(sizes); 
} 

public static Camera.Size determineBestPictureSize(Camera.Parameters parameters) { 
    List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 
    return determineBestSize(sizes); 
} 

protected static Camera.Size determineBestSize(List<Camera.Size> sizes) { 
    Camera.Size bestSize = null; 
    long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
    long availableMemory = Runtime.getRuntime().maxMemory() - used; 
    for (Camera.Size currentSize : sizes) { 
     int newArea = currentSize.width * currentSize.height; 
     long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :)) 
     boolean isDesiredRatio = (currentSize.width/4) == (currentSize.height/3); 
     boolean isBetterSize = (bestSize == null || currentSize.width > bestSize.width); 
     boolean isSafe = neededMemory < availableMemory; 
     if (isDesiredRatio && isBetterSize && isSafe) { 
      bestSize = currentSize; 
     } 
    } 
    if (bestSize == null) { 
     return sizes.get(0); 
    } 
    return bestSize; 
} 
+1

wydaje się dość bezcenne informacje tutaj! – Fattie

2

Powinieneś uruchomić tę samą pętlę nad rozmiarami zwróconymi przez parameters.getSupportedPictureSizes() i nie polegać na domyślnym rozmiarze obrazu. Co więcej, wolałbym poszukać najlepszej odpowiadającej pary rozmiarów podglądu/obrazu i pozwolić, aby obraz został przycięty na ekranie, jeśli proporcje te nie pasują do proporcji ekranu w układzie cameraPreview.

+0

Cóż, redagował pytanie, aby dodać metodę, której używam do wyboru rozmiaru obrazu. Ale myślę, że to wszystko dotyczy podglądu, ponieważ nie pokazuje pełnego możliwego kąta kamery, jak zrobione zdjęcie. Próbowałem porównać moją powierzchnię podglądu z tą na Instagramie, a podgląd na Instagramie pokazał pełny kąt jak zdjęcie zrobione przez mój kod, więc problem jest w moim podglądu jakoś – AbdelHady

+0

Jakie rozmiary dostaję na twoje urządzenie? Czy mają ten sam współczynnik kształtu? –

+0

Cóż, zastosowane przeze mnie metody dały mi następujące wyniki w LG-G2: rozmiar podglądu to 1776X1080, a rozmiar obrazu to 3264X2448 – AbdelHady

Powiązane problemy