2017-03-03 1 views
0

Ich versuche, Microsofts ProjektOxford EmotionApi Bild-Auto-Rotator-Code anzupassen. Jedes von der Gerätekamera aufgenommene Bild wird auf seinen Winkel hin analysiert und dann in die korrekte Landschaftsansicht gedreht, um von der Emotion-API analysiert zu werden.Eine Bitmap drehen, ohne einen ImageURI/ContentResolver zu verwenden?

Meine Frage ist: Wie würde ich den folgenden Code anpassen, um ein Bitmap als Argument zu nehmen? Ich bin auch in Bezug auf die Rolle von Content Resolver und ExitInterface in diesem Fall völlig verloren. Jede Hilfe wird sehr geschätzt.

private static int getImageRotationAngle(
     Uri imageUri, ContentResolver contentResolver) throws IOException { 
    int angle = 0; 
    Cursor cursor = contentResolver.query(imageUri, 
      new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); 
    if (cursor != null) { 
     if (cursor.getCount() == 1) { 
      cursor.moveToFirst(); 
      angle = cursor.getInt(0); 
     } 
     cursor.close(); 
    } else { 
     ExifInterface exif = new ExifInterface(imageUri.getPath()); 
     int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

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

// Rotate the original bitmap according to the given orientation angle 
private static Bitmap rotateBitmap(Bitmap bitmap, int angle) { 
    // If the rotate angle is 0, then return the original image, else return the rotated image 
    if (angle != 0) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(angle); 
     return Bitmap.createBitmap(
       bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    } else { 
     return bitmap; 
    } 
} 

Antwort

0

wie würde ich passen Sie den Code unten ein Bitmap als Argument zu nehmen?

Sie können nicht.

Ich bin auch in Bezug auf die Rolle der Content-Resolver und ExitInterface in diesem Fall völlig verloren

Der Code in Ihrer Frage verwendet die EXIF ​​Orientation Tag, um die Orientierung zu bestimmen, die die angewandt werden soll Bild, wie es von der Kamera gemeldet wurde, die das Foto aufgenommen hat (oder was auch immer dieses Tag festgelegt hat). ExifInterface ist Code zum Lesen von EXIF-Tags. ExifInterface muss mit den eigentlichen JPEG-Daten arbeiten, nicht eine decodierte Bitmap — a Bitmap hat nicht mehr die EXIF-Tags.

Der ContentResolver Code ist dort Bug-riddled und sollte nicht verwendet werden. Die ExifInterface, die in der com.android.support:exifinterface Bibliothek kommt, hat einen Konstruktor, der eine InputStream nimmt, von der es das JPEG lesen wird. Der richtige Weg, um die Uri hier zu verwenden, besteht darin, sie an openInputStream() über die ContentResolver weiterzuleiten und diesen Strom an den ExifInterface Konstruktor weiterzuleiten.

+0

Verstanden, danke für die gründliche Erklärung. Irgendwelche Empfehlungen zum Drehen einer Bitmap? –

+0

@ A.Xu: Nun, die 'rotateBitmap()' Methode in Ihrer Frage wird die Bitmap rotieren. Der Punkt hinter dem gesamten EXIF-Header ist, festzustellen, ob ein JPEG gedreht werden sollte und wenn ja, um wie viel. – CommonsWare

Verwandte Themen