2013-10-08 19 views
5

Moja aplikacja otwiera aparat za pomocą uchwytu powierzchni. Aparat otwiera się z domyślnym rozmiarem podglądu. W przypadku niektórych urządzeń domyślny rozmiar podglądu pozwala uzyskać więcej obrazu, niż jest to faktycznie widoczne na ekranie. W celu uniknięcia tego, zacząłem samodzielnie ustawiać rozmiar podglądu. Kryterium polega na wybraniu rozmiaru podglądu z dostępnej listy rozmiarów, która jest najbliższa szerokości ekranu.Podgląd aparatu z Androidem Rozmiar wydania

To działa dobrze przez większość czasu. Ale często natknę się na kilka urządzeń, które nie podoba mi się wybrany przeze mnie rozmiar podglądu.

1) Nexus 4 nie przechwycił obrazu dla jednego z wybranych rozmiarów podglądu. 2) Samsung S 4 daje pasmo linii (szum) wzdłuż przechwyconych obrazów.

Tak więc chciałem zrozumieć, czy robię coś wbrew standardowi. Oto moje pytania: -

1) Używam uchwytu do powierzchni, aby otworzyć kamerę. Czy jest jakiś inny sposób, w jaki mogę korzystać ze sprzętu kamery w mojej aplikacji.

2) Wybieram rozmiar podglądu z listy dostępnych rozmiarów. Czy są jakieś konkretne, których powinienem szukać przed wyborem dowolnego rozmiaru? Logika wyboru rozmiaru jest wymieniona poniżej: -

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; 
    } 

Wszelkie wskazówki na ten temat naprawdę pomogą.

Dzięki! Gagan

Odpowiedz

10

Podczas pracy z aparatem masz kilka różnych rozmiarów do rozważenia:

wielkość czujnika Aparat posiada natywną rozdzielczość i proporcje, które są ustalone przez sprzęt.

Rozmiar zdjęcia Jest to rozmiar obrazu utworzonego po poinformowaniu aparatu o zrobieniu zdjęcia. Jeśli ma taki sam współczynnik kształtu, jak rozdzielczość natywna, zostanie bezpośrednio skalowany. Jeśli współczynnik proporcji jest inny, zostanie przycięty z rozmiaru natywnego. Z mojego doświadczenia wynika, że ​​największy rozmiar zwracany przez getSupportedPictureSizes jest natywną rozdzielczością aparatu.

rozmiar podglądu Jest to wielkość obrazu podglądu, który jest pokazany na ekranie. Może to być inny współczynnik kształtu niż rozmiar natywny lub rozmiar obrazu, co powoduje dalsze przycinanie.

Aby uzyskać jak najdokładniejsze dopasowanie między tym, co widzisz na ekranie, a obrazem, który powstaje podczas robienia zdjęcia, spróbuj wybrać rozmiar podglądu o proporcjach jak najbliżej współczynnika kształtu obrazu, który wybrano. Ogólnie staram się uzyskać zarówno jak najbliżej rodzimego rozmiaru.