tkt989 🍵 ブログ

日々のメモ

Andoid P の ImageDecoder を触ってみる

2018/04/01

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

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

画像の表示

var uri = Uri.parse("android.resource://${packageName}/drawable/image")
val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source)
imageView.setImageBitmap(bitmap)

drawableをURIにして読み込む。

リサイズ

var 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からリサイズなどができる。

加工

var 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)

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

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


使用した画像

Charlesjsharp / Cassius blue (Leptotes cassius theonus), Cuba / CC BY-SA 4.0 File:Cassius blue (Leptotes cassius theonus) underside.JPG - Wikimedia Commons