#初めに
以前、画像のUriからByteArrayに変換する処理を投稿させていただきましたが、それを利用して今度は画像が編集によって回転されている場合、逆方向に回転をさせてしっかりと縦画面表示になる様に実装していきたいと思います
#導入方法
implementation("androidx.exifinterface:exifinterface:1.3.3")
###実装例
val imageStream: InputStream? = contentResolver.openInputStream(imageUri)
val bitmap = BitmapFactory.decodeStream(imageStream)
val byteArrayOutputStream = ByteArrayOutputStream()
val compressFormat = when (mimeType) {
MediaType.Jpeg -> {
Bitmap.CompressFormat.JPEG
}
MediaType.Png -> {
Bitmap.CompressFormat.PNG
}
else -> {
throw IllegalStateException("media type not found")
}
}
// ここで回転されてる角度を取得する
val orientation = ExifInterface(
contentResolver.openInputStream(imageUri)
?: throw ImageDecodeException("stream can not open")
).getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL
)
// ここで回転されてる角度によって回転し直す角度を決めて変換メソッドを呼び出す
val rotatedBitmap = when (orientation) {
ExifInterface.ORIENTATION_ROTATE_90 -> rotateImage(bitmap = bitmap, angle = (90F))
ExifInterface.ORIENTATION_ROTATE_180 -> rotateImage(bitmap = bitmap, angle = (180F))
ExifInterface.ORIENTATION_ROTATE_270 -> rotateImage(bitmap = bitmap, angle = (270F))
else -> bitmap
}
rotatedBitmap.compress(compressFormat, 100, byteArrayOutputStream)
byteArrayOutputStream.toByteArray()
/**
* 回転した Bitmap を返す
*/
private fun rotateImage(bitmap: Bitmap, angle: Float): Bitmap {
return Bitmap.createBitmap(
bitmap,
0,
0,
bitmap.width,
bitmap.height,
Matrix().apply { setRotate(degree) },
true
)
}
###最後に
以前の投稿でも書いた部分を書くかは悩みましたが、備忘録的な扱いが多いためわかりやすい様にコード全体を書きました。
何かの役に立てれば幸いです