2016-07-20 6 views
0

Этот вопрос, кажется, часто возникает, я много читал по этому вопросу, мой вопрос в том, когда я выбираю изображение из галереи и передаю его на результат работы не так, поэтому я хочу его прочитать и исправить, так что это всегда портрет, Я реализовал методы, которые работают для запуска камеры, съемки и проверки данных Exif, чтобы убедиться, что ее всегда портрет но это не похоже на работу для выбора изображений для галереи моей переменной скоростью вращения всегда будет возвращать 0Вертикальное изображение, выбранное из галереи на результат деятельности на андроид

ExifInterface exifInterface = new ExifInterface(imgFile.getAbsolutePath()); 
int rotation = 
     exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
     ExifInterface.ORIENTATION_NORMAL); 
     int rotationInDegrees = exifToDegrees(rotation); 
     System.out.println(rotation); 
     Matrix matrix = new Matrix(); 

     if (rotation != 0f) { 

      matrix.preRotate(rotationInDegrees); 
      Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 
      0, bitmap.getWidth(), bitmap.getHeight(), 
      matrix,false); 
      imgView.setImageBitmap(bitmap2); 
      path = saveToInternalStorage(imageFileName,bitmap2,getApplicationContext()); 
      } 
      else 
      path = saveToInternalStorage(imageFileName,bitmap,getApplicationContext()); 
      } 
      catch (IOException e) { 
      e.printStackTrace(); 
    } 

ExifToDegrees методу

private static int exifToDegrees(int exifOrientation) { 
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { 
     return 90; 
    } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { 
     return 180; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { 
     return 270; } 
    else if (exifOrientation == 6) { 
     return 90; } 
    else if (exifOrientation == 3) { 
     return 180; } 
    else if (exifOrientation == 8) { 
     return 270; } 
    return 0; 
} 

Как уже упоминалось, я много читал об этом, некоторые говорят, что его ошибка с андроидом некоторые говорят, что его до сборщика файла новый недавнему-х, и мы должны использовать

getAbsolutePath() 

и проверять для каждого SDK версия и будет сохранить изображение первого, я сделал все это не радость некоторые говорят, что мы не должны использовать Exif на всех и что

MediaStore.Images.ImageColumns.ORIENTATION 

должен работать, но опять же это не сработало ,

Я нацеливание устройств с ICS на М (я все разрешения мне нужно должное) Я сохраняю изображение в мою папку

File directory = cw.getDir("SimpleAAC", Context.MODE_PRIVATE); 

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

Intent intent = new Intent(); 
        intent.setType("image/*"); 
        intent.setAction(intent.ACTION_GET_CONTENT); 
        startActivityForResult(Intent.createChooser(intent, 
        "Select A Picture"), PICK_IMAGE_REQUEST); 
        dialog.dismiss(); 

здесь мой onActivityResult код для галереи

if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != 
null && data.getData() != null) { 

     Uri uri = data.getData(); 

      BitmapFactory.Options bitmapOptions = new 
      BitmapFactory.Options(); 
      bitmapOptions.inSampleSize = 4; 
      InputStream inputStream = null; 
     try { 
      inputStream = getContentResolver().openInputStream(uri); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
      Bitmap scaledBitmap = BitmapFactory.decodeStream(inputStream, 
      null, bitmapOptions); 
      String timeStamp = new 
      SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String imageFileName = timeStamp + ".jpg"; 

     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     File directory = cw.getDir("SimpleAAC", Context.MODE_PRIVATE); 
     File mypath = new File(directory,imageFileName); 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(mypath); 
      scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     //the relevant parts of this method(setThumbNailImageAndSave) are 
     // included above  


     finalPath = setThumbnailImageAndSave(imageView,mypath); 
     ImageLoader imageLoader = ImageLoader.getInstance(); 
     DisplayImageOptions options = new 
     DisplayImageOptions.Builder().cacheInMemory(true) 
       .cacheOnDisc(true).resetViewBeforeLoading(true) 
       .showImageForEmptyUri(R.drawable.ic_insert_photo_black_24dp) 
       .showImageOnFail(R.drawable.ic_insert_photo_black_24dp) 
     .showImageOnLoading(R.drawable.ic_insert_photo_black_24dp).build(); 

     imageLoader.displayImage(finalPath, imageView, options); 
     System.out.println(finalPath); 
    } 

Итак, чтобы завершить этот вопрос, я ищу разъяснения, это ошибка? могу ли я обойти это, используя MediaStore.Images.ImageColumns.ORIENTATION, и если да, то как? это намерение.setAction (intent.ACTION_GET_CONTENT)? это изменения файла kitkat?

Честно говоря, я так много читал, противоречащую информацию об этом и ничего я, кажется, попробовать работы, спасибо за все ответы

+0

Почему бы вам не просто измерить ширину и высоту. если ширина, если она больше высоты, вы можете предположить, что это было в пейзаже. –

+0

Был там мой друг спасибо за ответ, это не работает для нескольких устройств, но, безусловно, план b @Eugene H –

+0

Он работал для меня ..! Решено Решение [Решено: как повернуть изображение до ориентации по умолчанию, выбранное из галереи в android] (http://stackoverflow.com/questions/40758952/solved-how-to-rotate-image-to-its-defauld-orientation -selected-from-gallery-in) –

ответ

2

это ошибка?

В вашем коде? Возможно. Неясно, как imgFile в вашем первом фрагменте кода относится к вашему последнему фрагменту кода. Но вы удаляете все заголовки EXIF, расшифровывая растровое изображение, а затем кодируя его в этом последнем фрагменте кода. Если это файл, который вы просматриваете через ExifInterface в своем первом фрагменте кода, это ваша проблема.

Могу ли я обойти это с помощью MediaStore.Images.ImageColumns.ORIENTATION, и если да, то как?

Нет, потому что ваше изображение может быть не из MediaStore.

Вместо этого, с учетом вашего uri, позвоните по номеру openInputStream() по номеру ContentResolver. Затем передайте это openInputStream() на номер a better ExifInterface, который может читать из потоков, а не требовать файл. This sample app демонстрирует этот процесс, включая копию лучшего кода ExifInterface, хотя я использовал InputStream из активов, а не из ContentResolver.

Если вы хотите сделать локальную копию изображения по другим причинам, то избавитесь от декодирования и кодирования битмап-логики в этом последнем фрагменте кода. Вместо этого, openInputStream() с этим uri, откройте файл FileOutputStream на нужном файле и скопируйте байты с использованием обычного ввода/вывода Java. Это приведет к сохранению заголовков EXIF.

Кроме того, в любом случае, сделайте все это, пожалуйста, на фоновом потоке.

+0

Genius большое вам спасибо, я много читал о том, что вы упомянули, например, о потере информации exif об декодировании растрового изображения, я получу это утром. Еще раз спасибо –

+0

Возможно, теперь я могу остановить все эти махинации –

+0

или, может быть, не читал, так как ваш пост проверяет ваш демонстрационный проект и некоторые из ваших многих других сообщений, и, честно говоря, я просто не понимаю его вообще, и то, что вы сказали о копировании байтов из выходного потока в файл, также выходит за рамки me –