2016-12-01 41 views
20

W mojej niestandardowej kamerze muszę zapisać orientację przechwytywanego obrazu. Ten kod działa doskonale dla innych wersji Androida. Ale nie działa w wersji 6.0.1. Wynik, który otrzymuję, jest nieprawidłowy po zapisaniu atrybutów w pliku obrazu.Android Save Image Informacje Exif idą źle w Marshmallow 6.0.1

try { 
    exif = new ExifInterface(pictureFile.getAbsolutePath()); 
    exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation); 
    exif.saveAttributes(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Co zostanie zapisane i jak uzyskać orientację? –

+0

Wziąłem orientację przy użyciu SensorEventListener –

+1

Następnie pokaż nam hwow. To tylko połowa pytania. Kiedy nie dostaliśmy tej historii. –

Odpowiedz

1

Wypróbuj za uratowanie orientację różnymi kątami dla przechwyconych obrazów: -

Options options = new Options(); 

// downsizing image as it throws OutOfMemory Exception for larger 
// images 

     options.inSampleSize = 8; 
    ExifInterface exif; 
    try { 
     exif = new ExifInterface(fileUri.getPath()); 

     int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 0); 
     Log.d("EXIF", "Exif: " + orientation); 
     Matrix matrix = new Matrix(); 
     if (orientation == 6) { 
      matrix.postRotate(90); 
      Log.d("EXIF", "Exif: " + orientation); 
     } else if (orientation == 3) { 
      matrix.postRotate(180); 
      Log.d("EXIF", "Exif: " + orientation); 
     } else if (orientation == 8) { 
      matrix.postRotate(270); 
      Log.d("EXIF", "Exif: " + orientation); 
     } 

     myBitmap = BitmapFactory.decodeFile(path_img, options); 

     myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, 
       myBitmap.getWidth(), myBitmap.getHeight(), matrix, 
       true); 

    } catch (Exception e) { 

    } 
+0

to nie jest dobry sposób na zapisanie orientacji –

1

Odkąd doświadczyło problemów i różne zachowanie czytanie EXIF ​​informacji z innego producenta sugeruję, że masz orientację z zapisanego identyfikatora URI obrazu, można go zapisać do interfejsu EXIF.

public static void getImageOrientationFromUri(@NonNull ContentResolver contentResolver, @NonNull Uri uri) { 
    if (uri.getPath() == null) 
     throw new NullPointerException("URI Path should not be null"); 

     float rotationInDegrees = 0; 

     Cursor cursor = contentResolver.query(uri, new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, 
       null, 
       null, 
       null); 

     if (cursor != null && cursor.moveToFirst()) { 
      int col = cursor.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION); 
      if (col != -1) 
       rotationInDegrees = cursor.getInt(col); 
      cursor.close(); 
     } 

     // here you can save to the EXIF interface getting the apropriate value from rotationInDegrees 

     //If you want to display the image create the bitmap using: 

     //Bitmap sourceBitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri); 

     //Matrix matrix = new Matrix(); 
     //matrix.preRotate(rotationInDegrees); 

     //you can change the signature of the method to return a `Bitmap` and return 
     //Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, false); 

} 
+0

mój problem polega na zapisywaniu informacji exif przeciwko obrazkowi –

1

Inne rozwiązania polegają na przepisywaniu obrazu zamiast na manipulowaniu informacjami EXIF. Proponuję zrobić to jak próbowałeś tylko z poprawnymi stałych:

try { 
    exif = new ExifInterface(pictureFile.getAbsolutePath()); 
    exif.setAttribute(ExifInterface.TAG_ORIENTATION, 
         Integer.toString(ExifInterface.ORIENTATION_ROTATE_90)); 
    exif.saveAttributes(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

podstawie kodu źródłowego należy użyć jednej z następujących wartości:

  • ExifInterface.ORIENTATION_UNDEFINED
  • ExifInterface.ORIENTATION_NORMAL
  • ExifInterface.ORIENTATION_FLIP_HORIZONTAL
  • ExifInterface.ORIENTATION_ROTATE_180
  • ExifInterface.ORIENTATION_FLIP_VERTICAL
  • ExifInterface.ORIENTATION_TRANSPOSE
  • ExifInterface.ORIENTATION_ROTATE_90
  • ExifInterface.ORIENTATION_TRANSVERSE
  • ExifInterface.ORIENTATION_ROTATE_270
+0

ten kod nie działa, to mój problem –

+0

Po prostu za pewnie, wypróbowałeś te stałe, które połączyłem? – rekire

+0

Tak, próbowałem tej metody i jej nie działa w niektórych wersjach systemu Android, proszę ponownie podać moje pytanie –

0

WSPARCIE Uakt:

Google wczoraj zwolniony 25.1.0 wersję biblioteki wsparcia z masywnej aktualizacji w ExifInterface, który głównie koncentruje się na czytaniu i zapisywaniu atrybutów pliku obrazu na najnowszej wersji Androida. Proszę spojrzeć na kod SOURCE i lepiej zrozumieć tę aktualizację.

Mam nadzieję, że to pomoże