2017-02-08 7 views
0

Я реализовал функцию захвата/выбора изображения, и он отлично работает на HTC, однако на Samsung Galaxy Note 4 (версия для Android 5.1.1) он поворачивает изображение на 90 градусов , Вот 2 варианта кода, но по-прежнему вращается:Изображение, снятое или взятое из imagelibrary, повернутое фото на 90 градусов

ВАРИАНТ 1:

public void captureImageCameraOrGallery() { 

     Intent galleryintent = new Intent(Intent.ACTION_GET_CONTENT, null); 
     galleryintent.setType("image/*"); 

     Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     Intent chooser = new Intent(Intent.ACTION_CHOOSER); 
     chooser.putExtra(Intent.EXTRA_INTENT, galleryintent); 
     chooser.putExtra(Intent.EXTRA_TITLE, "Select from:"); 

     Intent[] intentArray = { cameraIntent }; 
     chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 
     startActivityForResult(chooser, REQUEST_PIC); 
} 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

      if (requestCode == REQUEST_PIC && resultCode == RESULT_OK) { 
       Uri selectedImageUri = data.getData(); 
       Bitmap bmp = null; 
       try { 
        if (selectedImageUri != null) { 
         bmp = getBitmapFromUri(selectedImageUri); 
        } 

        if (bmp == null) { 
        return; 
        } 

        ExifInterface ei = new ExifInterface(selectedImageUri.getPath()); 
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_NORMAL); 

        Log.e("Capture orientation: ", String.valueOf(orientation)); 
        int rotateAngle = 0; 
        switch(orientation) { 

         case ExifInterface.ORIENTATION_ROTATE_90: 
         rotateAngle = 90; 
         break; 

         case ExifInterface.ORIENTATION_ROTATE_180: 
         rotateAngle = 180; 
         break; 

         case ExifInterface.ORIENTATION_ROTATE_270: 
         rotateAngle = 270; 
         break; 


         default: 
         break; 
        } 

        bmp = rotateImage(bmp, rotateAngle); 
        mUserImage.setImageBitmap(bmp); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
    } 

ВАРИАНТ 2:

Использование PhotoPicker Lib компиляции «me.iwf.photopicker: PhotoPicker: 0.9.5 @ aar '

public void captureImageCameraOrGallery() { 

     PhotoPicker.builder() 
       .setPhotoCount(1) 
       .setShowCamera(true) 
       .setShowGif(true) 
       .setPreviewEnabled(false) 
       .start(this, PhotoPicker.REQUEST_CODE); 
    } 

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == RESULT_OK && requestCode == PhotoPicker.REQUEST_CODE) { 
      if (data != null) { 
       ArrayList<String> photos =      data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS); 
       Uri selectedImageUri = Uri.fromFile(new File(photos.get(0))); 

       Bitmap bmp = null; 
       try { 
        if (selectedImageUri != null) { 
         bmp = getBitmapFromUri(selectedImageUri); 
        } 

        if (bmp == null) { 
         return; 
        } 
        mUserImage.setImageBitmap(bmp); 


       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

Однако он все еще вращается. Любая помощь будет оценена по достоинству.

ответ

1

Если в вашем первом варианте вы всегда получаете 0 для ориентации, вы можете попробовать следующее. (От this)

Попытайтесь использовать информацию в курсове содержания.

float photoRotation = 0; 
boolean hasRotation = false; 
String[] projection = { Images.ImageColumns.ORIENTATION }; 
try { 
    Cursor cursor = getActivity().getContentResolver().query(photoUri, projection, null, null, null); 
    if (cursor.moveToFirst()) { 
     photoRotation = cursor.getInt(0); 
     hasRotation = true; 
    } 
    cursor.close(); 
} catch (Exception e) {} 

if (!hasRotation) { 
    ExifInterface exif = new ExifInterface(photoUri.getPath()); 
    int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
      ExifInterface.ORIENTATION_UNDEFINED); 

    switch (exifRotation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: { 
      photoRotation = 90.0f; 
      break; 
     } 
     case ExifInterface.ORIENTATION_ROTATE_180: { 
      photoRotation = 180.0f; 
      break; 
     } 
     case ExifInterface.ORIENTATION_ROTATE_270: { 
      photoRotation = 270.0f; 
      break; 
     } 
    } 
} 
+0

Извините немного смешано с флагом! HasRotation. Делаем ли мы поворот в случае, если (! HasRotation) {// rotate} else {// shoululd загружать изображение без вращения здесь? } – Svitlana

+0

Есть двойная проверка - сначала мы проверяем, вращается ли содержимое с помощью 'Cursor', если это так, то мы устанавливаем флаг и не проверяем exif-информацию, если не затем проверяем информацию exif и получаем данные о ротации оттуда. –

+0

Хорошо, спасибо! И еще один вопрос: я должен настроить smth следующим образом: intent.putExtra (MediaStore.EXTRA_OUTPUT, mCapturedImageURI); когда вызывается новый Intent и используете mCapturedImageURI как глобальную переменную? Имеет ли MediaStore.EXTRA_OUTPUT большое влияние? Или я могу получить его только Uri photoUri = data.getData(); в onActivityResult напрямую? – Svitlana

0

В некоторых устройствах максимальное изображение устройства samsumg поворачивается на 90 градусов. , для этого вам нужно проверить его в файле exif, какая именно его ориентация, и в соответствии с этим вам нужно работать.

int rotateDegree = 0; 
       try { 
        File imageFile = new File(sourcepath); 
        ExifInterface exif = new ExifInterface(
          imageFile.getAbsolutePath()); 
        int orientation = exif.getAttributeInt(
          ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_NORMAL); 

        switch (orientation) { 
        case ExifInterface.ORIENTATION_ROTATE_270: 
         rotateDegree = 270; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_180: 
         rotateDegree = 180; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_90: 
         rotateDegree = 90; 
         break; 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       Matrix matrix = new Matrix(); 
     matrix.postRotate(rotateDegree); 
     bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
+0

Благодарим вас за ответ. Однако вращение все еще происходит. В любом случае, спасибо. – Svitlana