Edited at

Android P の ImageDecoder を触ってみる

More than 1 year has passed since last update.

Android P PreviewからImageDecoderが使えるように。


Android P gives you an easier way to decode images to bitmaps or drawables -- ImageDecoder, which deprecates BitmapFactory.



画像の表示

val uri = Uri.parse("android.resource://${packageName}/drawable/image")

val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source)
imageView.setImageBitmap(bitmap)

normal.png

drawableをURIにして読み込む。


リサイズ

val uri = Uri.parse("android.resource://${packageName}/drawable/image")

val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source, { decoder, info, source ->
decoder.setResize(300, 300)
})
imageView.setImageBitmap(bitmap)

decode...にコールバックを指定すれば、decoderからリサイズなどができる。

resize.png


加工

val uri = Uri.parse("android.resource://${packageName}/drawable/image")

val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source, { decoder, info, source ->
decoder.setResize(300, 300)
decoder.setPostProcessor { canvas ->
val path = Path()
path.fillType = Path.FillType.INVERSE_EVEN_ODD
path.addCircle((canvas.width/2).toFloat(), (canvas.height/2).toFloat(), (canvas.width/2).toFloat(), Path.Direction.CW)

val paint = Paint()
paint.isAntiAlias = true
paint.color = Color.TRANSPARENT
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)

canvas.drawPath(path, paint)

return@setPostProcessor PixelFormat.TRANSLUCENT
}
})
imageView.setImageBitmap(bitmap)

setPostProcessorで読み込んだ画像の加工ができる。

preprocess.png

こんな感じに円形にクリッピングなど。


使用した画像

Charlesjsharp / Cassius blue (Leptotes cassius theonus), Cuba / CC BY-SA 4.0

File:Cassius blue (Leptotes cassius theonus) underside.JPG - Wikimedia Commons