2017-07-08 1 views
1

J'ai ce problème: quand je charge la photo que j'ai obtenir de la caméra ou la galerie, avec ce code:comment enregistrer la rotation correcte du Bitmap

if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == REQUEST_TAKE_PHOTO || requestCode == REQUEST_PICK_PHOTO) 
     //dalla fotocamera 
     { 
      if (data != null)mMediaUri = data.getData(); 

      Glide.with(this).load(mMediaUri).bitmapTransform(new CenterCrop(context), new RoundCornerTransformation(context, 15, 2)).into(photo); 
     } 
} 

l'image est affichée dans la bonne façon dans l'imageView. Sinon, je dois compresser le bitmap, donc je l'ai fait ce code pour faire la compression:

fun compressBitmapInBackgroundtoByteArray(uri: Uri?,context: Context, callback: OnFinishedCallback) { 

    Observable.create<ByteArray> { s -> 


     var imageStream: InputStream? = null 
     try { 
      imageStream = context.getContentResolver().openInputStream(uri) 
     } catch (e: FileNotFoundException) { 
      s.onError(e) 
     } 

     val bmp = BitmapFactory.decodeStream(imageStream) 

     var stream: ByteArrayOutputStream? = ByteArrayOutputStream() 
     bmp.compress(Bitmap.CompressFormat.JPEG, 0, stream) 
     bmp.recycle() 
     val compressed:ByteArray? =(stream?.toByteArray()) 

     try { 
      stream?.close() 

     } catch (e: IOException) { 
      s.onError(e) 
     } 

     s.onNext(compressed!!) 
     s.onComplete() 

    }.subscribeOn(Schedulers.computation()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeBy (
        onNext = { compress -> callback.onNext(compress) }, 
        onError = { error-> callback.onError(error.message) }, 
        onComplete = { callback.onCompleted() } 
      ) 


} 

et ce détachez l'orientation correcte. En fait, lorsque je tente de charger le byteArray que j'ai donné, avec ce code:

if(user.getPicUrl() != null) { 
     Glide.with(this).load(user.getPicture()).bitmapTransform(new CenterCrop(context), new RoundCornerTransformation(context, 15, 2)).into(photo); 
     PICTURE_INSERTED = true; 
    } 

l'image a la rotation de 90 degrés. J'ai lu que Glide prend en charge la rotation Exif, mais dans ce cas, cela ne fonctionne pas. Pourquoi? Il existe un moyen de "stocker" l'orientation correcte à enregistrer dans le serveur? Merci

Répondre

1

Vous devez copier les données EXIF ​​de l'image originale vers l'image redimensionnée finale. Vous pouvez utiliser ExifInterface pour cela.

https://developer.android.com/reference/android/media/ExifInterface.html#ExifInterface

Par exemple;

val oldExif = ExifInterface(oldImagePath) 
val exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION) 

if (exifOrientation != null) { 
val newExif = ExifInterface(imagePath) 
newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation) 
newExif.saveAttributes() 
} 
+0

nécessite API 24, mon min est 19/21 ... – ste9206

+0

https://github.com/zetbaitsu/Compressor Peut-être que cette bibliothèque aide you.Its min sdk 14. –

+0

Je suis regarde ExifInterface now.Its supporte même API 5.Probably votre importation est fausse.Mon importer comme ceci: import android.media.ExifInterface –