2012-07-26 11 views
13

Napisałem niestandardową czynność kamery, aby poradzić sobie z niektórymi problemami, które miałem z niektórymi urządzeniami z Androidem podczas wywoływania świadomego przechwytywania obrazu. Użytkownik może albo wybrać zapis obrazu, albo po prostu użyć danych zwróconych z poziomu OnPictureTakenCallback.Problem z orientacją obrazu na Androida przy niestandardowej aktywności aparatu fotograficznego

Problem, który mam, to prawidłowe wyświetlanie obrazu w odniesieniu do jego orientacji. Zmuszam, aby działanie było wyświetlane portretowo, dzwoniąc pod numer SetRequestedOrientation.

Jak rozpoznać prawidłową orientację, w jakiej znajdowała się kamera, gdy użytkownik wykonał zdjęcie? tj. Użytkownik może wykonać zdjęcie z obrotem 90 (portret).

Próbowałem użyć getRotation() na domyślnym wyświetlaczu menedżera okien, ale z ustawieniem żądanej orientacji na portret, który zwraca tylko Surface.ROTATION_0.

Aktualizacja: Aby wyjaśnić inny problem, w jaki sposób mogę określić orientację z tylko danych byte[] w oddzwanianiu obrazu, jeśli użytkownik nie zapisał obrazu?

Aktualizacja: Po wypróbowaniu poniższych odpowiedzi z tym kodem, wszystko, co dostaję, to ExifInterface.ORIENTATION_NORMAL. Zmieniłem również mój kod, aby zapisać plik zwrócony z aparatu, ponieważ nie jestem pewien, czy istnieje łatwy sposób określenia orientacji za pomocą danych byte[].

private PictureCallback mPicture = new PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES), 
        "MyApp"); 
      if(!directory.exists()) 
      { 
       if(!directory.mkdirs()) 
       { 
        Log.d("CAMERA", "Unable to create directory to save photos."); 
        return; 
       } 
      } 
      File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg"); 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(data); 
      fos.close(); 
      ExifInterface exif = new ExifInterface(file.getCanonicalPath()); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
      int rotate = 0; 

      switch (orientation) 
      { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        rotate = 90; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        rotate = 180; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        rotate = 270; 
        break; 
       case default: 
        break; 
      } 
     } 
    }; 
+0

może ktoś pomóc http://stackoverflow.com/questions/28379130/how -to-set-camera-image-orientation –

Odpowiedz

15

SO stoją jakiś problem z orientacją aparatu.

Ten link pokazuje przykładową aplikację zwykłej aktywności przechwytywania Aparat: http://labs.makemachine.net/2010/03/simple-android-photo-capture/

Może powinieneś spróbować ustalające orientację robiąc coś takiego:

  ExifInterface exif = new ExifInterface(_path); 
      int exifOrientation = exif.getAttributeInt(
      ExifInterface.TAG_ORIENTATION, 
      ExifInterface.ORIENTATION_NORMAL); 

      int rotate = 0; 

      switch (exifOrientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
      rotate = 90; 
      break; 

     case ExifInterface.ORIENTATION_ROTATE_180: 
     rotate = 180; 
     break; 

     case ExifInterface.ORIENTATION_ROTATE_270: 
     rotate = 270; 
     break; 
     } 

      if (rotate != 0) { 
      int w = bitmap.getWidth(); 
      int h = bitmap.getHeight(); 

// Setting pre rotate 
      Matrix mtx = new Matrix(); 
      mtx.preRotate(rotate); 

     // Rotating Bitmap & convert to ARGB_8888, required by tess 
     bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); 
     bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
     } 
+0

Wydaje mi się, że działa prawidłowo ... znowu go wypięłam: http://labs.makemachine.net/2010/03/simple-android-photo-capture/ – Android2390

+0

Zaktualizowałem moje pytanie w odpowiedzi na twoją odpowiedź. – Bryan

+1

Użyłem tego kodu do obracania obrazu w metodzie obrazowania, ale niektóre, jak to działa, czy możesz mi pomóc, że zagłosuję za pomocą – Nitin

4

Musisz przeczytać metadane z oryginalnego pliku JPEG, aby zweryfikować orientację, w której zdjęcie zostało zrobione.

ExifInterface exif = new ExifInterface(SourceFileName); 
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Źródło: How to determine orientation of picture without ExifInterface?

Edit: odpowiadając na edytowanie próbowałeś stosując metodę getCameraInfo(), który jest dostępny z obiektu Camera upłynął w zwrotnego? Czy ma wymagane informacje?

Źródło: http://developer.android.com/reference/android/hardware/Camera.html

+0

Powinieneś być w stanie wywołać "orientację" w CameraInfo. http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html – bsempe

+0

Zgodnie z dokumentami jest to dostępne od poziomu API 9, tj. Android 2.3. Moja aplikacja to minimalny poziom interfejsu API 8. – Bryan

3

Wyjmowanie setRequestedOrientation() dozwolone getWindowManager().getDefaultDisplay().getRotation() dać prawidłowa rotacja. Domyślam się, że ustawienie żądanej orientacji zapobiega przerysowaniu aktywności podczas zmiany konfiguracji, a zatem urządzenie nie zna żadnego rodzaju zmiany rotacji. Moim jedynym problemem teraz jest przejście z trybu krajobraz na orientację 0 stopni do trybu krajobraz 180 stopni obrotu nie działa w ten sposób:

@Override 
public void onConfigurationChanged(Configuration newconfig) 
{ 
    super.onConfigurationChanged(newconfig); 

} 
3
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(holder); 
     Camera.Parameters parameters = mCamera.getParameters(); 
     if (this.getResources().getConfiguration().orientation != 
       Configuration.ORIENTATION_LANDSCAPE) 
     { 
      parameters.set("orientation", "portrait"); <----THis gets the job done!!! 
      // For Android Version 2.2 and above 
      mCamera.setDisplayOrientation(90); 
      // For Android Version 2.0 and above 
      parameters.setRotation(90); 
     } 


     // End Effects for Android Version 2.0 and higher 
     mCamera.setParameters(parameters); 
    } 
    catch (IOException exception) 
    { 
     mCamera.release(); 
    } 

} 
Powiązane problemy