2016-12-22 4 views
0

в моем приложении Мне нужно загрузить изображение с камеры.Почему у меня такой поворот изображения?

Это код, который я использовал:

private void openCamera() 
{ 
    mMediaUri =getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    photoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mMediaUri); 
    startActivityForResult(photoIntent, REQUEST_TAKE_PHOTO); 


} 


private Uri getOutputMediaFileUri(int mediaTypeImage) 
{ 
    //check for external storage 
    if(isExternalStorageAvaiable()) 
    { 
     File mediaStorageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES); 

     String fileName = ""; 
     String fileType = ""; 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new java.util.Date()); 

     fileName = "IMG_"+timeStamp; 
     fileType = ".jpg"; 

     File mediaFile; 
     try 
     { 
      mediaFile = File.createTempFile(fileName,fileType,mediaStorageDir); 
      Log.i("st","File: "+Uri.fromFile(mediaFile)); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      Log.i("St","Error creating file: " + mediaStorageDir.getAbsolutePath() +fileName +fileType); 
      return null; 
     } 
     return FileProvider.getUriForFile(getActivity(),BuildConfig.APPLICATION_ID + ".provider", mediaFile); 
    } 
    //something went wrong 
    return null; 

} 

private boolean isExternalStorageAvaiable() 
{ 
    String state = Environment.getExternalStorageState(); 

    if(Environment.MEDIA_MOUNTED.equals(state)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 


} 

    public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == DIALOG_CODE) 
    { 
     String s = data.getStringExtra("choose"); 

     if(s.equals(getString(R.string.takephoto))) 
     { 
      openCamera(); 
     } 
     else if(s.equals(getString(R.string.library))) 
     { 
      openGallery(); 
     } 
    } 
    else if(resultCode == RESULT_OK) 
    { 
     if (requestCode == REQUEST_TAKE_PHOTO || requestCode == REQUEST_PICK_PHOTO) //dalla fotocamera 
     { 
      if (data != null) //caso galleria 
      { 
       mMediaUri = data.getData(); 
      } 

      Picasso.with(getActivity()).load(mMediaUri).resize(1280, 1280).transform(new RoundedTransformation()).centerCrop().into(photo, new Callback() 
      { 
       public void onSuccess() 
       { 

       } 

       @Override 
       public void onError() { 

       } 
      }); 
     } 
    } 

} 

и он работает, но это дает мне эту ошибку: если взять фото, как это: enter image description here

он загружает изображение в ImageView таким образом: enter image description here

, но если я загружу изображение из галереи, он работает нормально.

Какая здесь ошибка? Thanks

+0

Вы должны повернуть изображение с помощью 'ExifInterface' См. Мой ответ ниже. –

ответ

4

Вам необходимо повернуть картинку ExifInterface.
Изображение вращается на основе угла захвата изображения.

ExifInterface будет вращать изображение, даже если вы щелкнете фотографию под любым углом.
Он будет отображаться правильно.

File mediaFile = new File(mediaPath); 
      Bitmap bitmap; 
      if (mediaFile.exists()) { 

       if (isImage(mediaPath)) { 

        Bitmap myBitmap = BitmapFactory.decodeFile(mediaFile.getAbsolutePath()); 
        int height = (myBitmap.getHeight() * 512/myBitmap.getWidth()); 
        Bitmap scale = Bitmap.createScaledBitmap(myBitmap, 512, height, true); 
        int rotate = 0; 
        try { 
         exif = new ExifInterface(mediaFile.getAbsolutePath()); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_UNDEFINED); 
        switch (orientation) { 
        case ExifInterface.ORIENTATION_NORMAL: 
         rotate = 0; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_270: 
         rotate = 270; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_180: 
         rotate = 180; 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_90: 
         rotate = 90; 
         break; 
        } 

        Matrix matrix = new Matrix(); 
        matrix.postRotate(rotate); 
        Bitmap rotateBitmap = Bitmap.createBitmap(scale, 0, 0, scale.getWidth(), 
          scale.getHeight(), matrix, true); 
        displayImage.setImageBitmap(rotateBitmap); 
     } 
} 
public static boolean isImage(String str) { 
     boolean temp = false; 
     String[] arr = { ".jpeg", ".jpg", ".png", ".bmp", ".gif" }; 
     for (int i = 0; i < arr.length; i++) { 
      temp = str.endsWith(arr[i]); 
      if (temp) { 
       break; 
      } 
     } 
     return temp; 
    } 
+0

Какая ошибка в его коде? – Gattsu

+0

Он хочет отобразить изображение надлежащим образом. в настоящее время изображение поворачивается. –

+0

Почему изображение повернулось? Укажите, что причина в вашем ответе Является ли это конкретным устройством? – Gattsu

Смежные вопросы