2013-10-08 15 views
5

Meine App öffnet die Kamera mit Oberflächenhalter. Die Kamera wird mit einer Standardvorschaugröße geöffnet. Auf bestimmten Geräten erfasst die Standardvorschaugröße mehr Bilder als tatsächlich auf dem Bildschirm sichtbar ist. Um dies zu vermeiden, habe ich angefangen, die Vorschaugröße selbst einzustellen. Kriterium ist, die Vorschaugröße aus der verfügbaren Größenliste auszuwählen, die der Breite des Bildschirms am nächsten kommt.Android Kamera Vorschau Größe Problem

Dies funktioniert die meiste Zeit gut. Aber oft stolpere ich über wenige Geräte, die die von mir gewählte Vorschaugröße nicht mögen.

1) Nexus 4 hat das Bild für eine der ausgewählten Vorschaugrößen nicht aufgenommen. 2) Samsung S 4 gibt ein Band von Linien (Rauschen) entlang der aufgenommenen Bilder.

Also wollte ich verstehen, ob ich etwas gegen den Standard mache. Hier sind meine Fragen: -

1) Ich benutze Oberflächenhalter, um die Kamera zu öffnen. Gibt es eine andere Möglichkeit, die Kamera-Hardware in meiner App zu verwenden.

2) Ich wähle die Vorschaugröße aus der Liste der verfügbaren Größen. Gibt es eine bestimmte, nach der ich suchen sollte, bevor ich irgendeine Größe auswähle? Logik für die Auswahl der Größe wird im Folgenden erwähnt: -

private Camera.Size getBestPreviewSize(int width, int height) 
    { 
     List<Size> sizes = camera.getParameters().getSupportedPreviewSizes(); 
     if (sizes == null) return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = height; 
     int targetWidth = width; 

     int minWidthDiff = 0; 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.width - targetWidth) < minDiff) { 
        if(size.width > width) { 
         if (minWidthDiff == 0) { 
          minWidthDiff = size.width - width; 
          optimalSize = size; 
         } 
         else if (Math.abs(size.width - targetWidth) < minWidthDiff) { 
          minWidthDiff = size.width - width; 
          optimalSize = size; 

         } 
         minDiff = Math.abs(size.width - targetWidth); 
        } 
       } 
      } 
     } 

     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

Alle Richtungen auf diese wird wirklich helfen.

Danke !! Gagan

Antwort

10

Wenn mit der Kamera arbeiten, haben Sie ein paar verschiedene Größen zu berücksichtigen:

Sensorgröße Die Kamera eine native Auflösung und Seitenverhältnis, das durch die Hardware bestimmt wird.

Bildgröße Dies ist die Größe des Bildes, das erzeugt wird, wenn Sie der Kamera sagen, dass sie ein Foto machen soll. Wenn es das gleiche Seitenverhältnis wie die native Auflösung ist, wird es direkt davon skaliert. Wenn das Seitenverhältnis unterschiedlich ist, wird es von der nativen Größe abgeschnitten. Nach meiner Erfahrung ist die größte von getSupportedPictureSizes zurückgegebene Größe die native Auflösung der Kamera.

Vorschau Größe Dies ist die Größe des Bildes Vorschau, die auf dem Bildschirm angezeigt wird. Es kann ein anderes Seitenverhältnis sein als die native Größe oder die Bildgröße, was zu einem weiteren Bildausschnitt führt.

Um die beste Übereinstimmung zwischen dem, was Sie auf dem Bildschirm sehen, und dem Bild, das bei der Aufnahme entsteht, zu erhalten, wählen Sie eine Vorschaugröße mit einem Seitenverhältnis, das so nah wie möglich am Bildseitenverhältnis liegt bin ausgewählt. Ich versuche generell, beide so nahe wie möglich an die ursprüngliche Größe heranzukommen.

Verwandte Themen