2016-11-10 7 views
1

Я выбираю изображение из галереи и показываю его на изображении. Изображение выбирается, но на телефонах samsung у него есть вопрос о вращении изображения, чтобы решить, что я проверяю, вращается ли изображение или нет в интерфейсе EXIF, и если поворот изменяет его угол.Изображение поворачивается, хотя ориентация 0 с использованием exif при выборе из галереи

Но это не работает для некоторых изображений. Некоторые изображения, которые я вижу прямо, но некоторые изображения, если они прямые, и они тоже вращаются.

Как я отлаживал ориентацию для изображения 0, он идет в случай по умолчанию и применяет нормальное растровое изображение к повернутому растровому изображению. Тем не менее изображение, которое я вижу, повернуто. Не клеится, почему это происходит ..

private void onSelectFromGalleryResult(Intent data) { 

    Bitmap bm=null; 
    if (data != null) { 
     try { 
      bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

    bm = Bitmap.createScaledBitmap(bm,512,512, true); 

    bm.compress(Bitmap.CompressFormat.PNG,100, bytes); 
    File destination = new File(Environment.getExternalStorageDirectory(), 
      System.currentTimeMillis() + ".png"); 
    FileOutputStream fo; 
    try { 
     destination.createNewFile(); 
     fo = new FileOutputStream(destination); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    loadImageFromFile(destination.getAbsolutePath()); 

} 



public void loadImageFromFile(String imageFile){ 

    try { 
     ExifInterface ei = new ExifInterface(imageFile); 
     int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_UNDEFINED); 

      Bitmap bitmap = BitmapFactory.decodeFile(imageFile); 

      Bitmap rotatedBitmap = null; 
      Log.e("orientation",String.valueOf(orientation)+" check"); 
      switch (orientation) { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        rotatedBitmap = rotateImage(bitmap, 90); 
        Log.e("orientation",String.valueOf(orientation)+" check"); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        rotatedBitmap = rotateImage(bitmap, 180); 
        Log.e("orientation",String.valueOf(orientation)+" check"); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        rotatedBitmap = rotateImage(bitmap, 270); 
        Log.e("orientation",String.valueOf(orientation)+" check"); 
        break; 
       case ExifInterface.ORIENTATION_NORMAL: 
        rotatedBitmap = bitmap; 
        Log.e("orientation",String.valueOf(orientation)+" check"); 
        break; 

       default: 
        rotatedBitmap = bitmap; 
        Log.e("orientation",String.valueOf(orientation)+" check"); 
        break; 
      } 

     if(rotatedBitmap != null) 
     { 
      profile_image.setImageBitmap(rotatedBitmap); 
      selectedBitmap = rotatedBitmap; 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      selectedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //replace 100 with desired quality percentage. 
      byte[] byteArray = stream.toByteArray(); 

       File tempFile = File.createTempFile("temp",null, getCacheDir()); 
       FileOutputStream fos = new FileOutputStream(tempFile); 
       fos.write(byteArray); 

       mProfileImage = tempFile; 
     } 

    } 
    catch (IOException ex) { 
     // UiUtils.showAlert(getString(R.string.error),NewGroupAcvitity.this); 
    } 
} 

public static Bitmap rotateImage(Bitmap source, float angle) { 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, 
      true); 
} 

EDIT:

-

@SuppressWarnings("deprecation") 
- private void onSelectFromGalleryResult(Intent data) { 
- 
-  Uri uri = (Uri)data.getData(); 
-  String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
-  Cursor cursor = getContentResolver().query(uri,filePathColumn, null, null, null); 
-  if(cursor != null) { 
-   cursor.moveToFirst(); 
-   int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
-   String picturePath = cursor.getString(columnIndex); 
-   cursor.close(); 
- 
-   loadImageFromFile(picturePath); 
-  } 
- } 

@greenapps - использовать выбранный файл, как это? Я пробовал это, но это не работало на устройствах xiaomi, поэтому я изменил код. Есть ли другой способ для других устройств?

Что здесь не так? Может ли кто-нибудь помочь? Спасибо.

+0

где «растровое изображение» в «rotatedBitmap = rotateImage (bitmap, 90);» родом из? – 0X0nosugar

+0

Код не работает для xiaomi. ОК. Но работает ли он на samsung? Вы неясны. – greenapps

+0

работает на samsung Я вижу прямое изображение. Но в xiaomi курсор возвращает значение null, поэтому я не могу выбрать изображение. @greenapps – Sid

ответ

1
loadImageFromFile(destination.getAbsolutePath()); 

Образ, который вы пытаетесь загрузить, изначально представляет собой растровое изображение, которое вы сжимаете до jpg и сохраняете в файле. destination - объект File для этого файла.

Растровые изображения не содержат информацию exif. И, следовательно, ваш файл jpg не будет содержать exif.

Так что бесполезно использовать ExifInterface.

Сид, я видел этот код раньше. И рассказал ту же историю. Возможно, это был даже ты, о котором я сказал.

+0

Я не знаю, я отправил вопрос на день. но то же самое я делаю для камеры и ее работы для нее. Тогда как решить эту проблему для устройств samsung. @greenapps – Sid

+0

Отмеченный код не может сработать. Не на одном устройстве. Поскольку растровые изображения не содержат информацию exif. – greenapps

+0

Если вы хотите определить ориентацию с информацией exif из файла jpg, выбранного в приложении галереи, используйте этот файл неправильно. Сначала не конвертируйте файл в растровое изображение, а затем сохраняйте его в другом файле без информации exif. – greenapps