2017-03-03 6 views
0

Microsoft의 projectOxford EmotionApi의 이미지 자동 회전 코드를 적용하려고합니다. 장치 카메라에서 촬영 한 각 이미지의 각도를 분석 한 다음 감정 API로 분석 할 올바른 가로보기로 회전합니다.ImageURI/ContentResolver를 사용하지 않고 비트 맵을 회전 하시겠습니까?

내 질문은 : 비트 맵을 인수로 사용하려면 아래 코드를 어떻게 적용합니까? 이 경우 Content Resolver와 ExitInterface의 역할에 관해서도 완전히 분실했습니다. 어떤 도움을 주셔서 감사합니다.

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

답변

0

는 어떻게 인수로 비트 맵을 아래의 코드를 적용 것인가?

수 없습니다. 나는 또한 완전히 문제의 코드에 적용 할 방향을 결정하기 위해 EXIF에게 Orientation 태그를 사용

이 경우 컨텐츠 확인자 및 ExitInterface의 역할로 손실하고

이미지 (사진을 찍은 카메라 또는 그 태그를 설정 한 모든 것)에 의해보고됩니다. ExifInterface은 EXIF ​​태그를 읽는 코드입니다. ExifInterface은 실제 JPEG 데이터와 함께 작동해야하며 디코딩되지 않습니다. BitmapBitmap에는 더 이상 EXIF ​​태그가 없습니다.

코드에 ContentResolver 코드가 버그로 가득 차서 사용해서는 안됩니다. com.android.support:exifinterface 라이브러리에 들어있는 ExifInterface에는 InputStream을 사용하는 생성자가 있으며이 생성자에서 JPEG을 읽습니다. Uri을 올바르게 사용하려면 ContentResolveropenInputStream()에 전달하고 해당 스트림을 ExifInterface 생성자로 전달합니다.

+0

잘 알고 계셔 주셔서 감사합니다. 비트 맵 회전에 대한 권장 사항은 무엇입니까? –

+0

@ A.Xu : 질문에서 'rotateBitmap()'메서드는 비트 맵을 회전시킵니다. 전체 EXIF ​​헤더 항목 뒤에있는 점은 JPEG를 회전해야하는지 확인하고, 그렇다면 얼마만큼 회전해야하는지 결정하는 것입니다. – CommonsWare