初めに
今回は、Android
実装でよく使われている画像読み込みライブラリの一つであるcoil
からモノクロで描画する機能が削除されるとのことで、代替実装を備忘録ついでに残しておこうと思います。
本文
まず、元々coil
で使われていたモノクロ機能のコードは下記のurlに飛んでもらえれば確認できます。
https://github.com/coil-kt/coil/blob/1.4.0/coil-base/src/main/java/coil/transform/GrayscaleTransformation.kt
coil
側はこれを基に自分たちで実装してくれれば、画像の加工するための機能自体は決してないから問題なく実装できると言っています。
- equals
- hashCode
- toString
上記三点は先述したurlにある元のコードと何も変わりませんが、他の部分でエラー3箇所出ると思います。
まず、元々はcoil
側で実装されていたkey
がcacheKey
という名前に変更されています。
次にtransform
の引数に変更があります。
最後にinput.safeConfig
でUnresolved reference: safeConfigになるかと思います。
以上、3つの理由によりエラーが発生してしまいます。
逆にそこさえ直してしまえば何の問題もなくこれまで通り利用することができるということです。
コード
実際に動くコードとしては、以下になります。
class GrayscaleTransformation : Transformation {
override val cacheKey: String
get() = javaClass.name
override fun equals(other: Any?) = other is GrayscaleTransformation
override fun hashCode() = javaClass.hashCode()
override fun toString() = "GrayscaleTransformation()"
override suspend fun transform(input: Bitmap, size: Size): Bitmap {
val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
paint.colorFilter = COLOR_FILTER
val output = createBitmap(input.width, input.height, input.config)
output.applyCanvas {
drawBitmap(input, 0f, 0f, paint)
}
return output
}
private companion object {
val COLOR_FILTER = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f) })
}
}
key
に関しては名前を変更するだけなので簡単だとは思います。
transform
に関しては不要になった引数を削除し、代わりにcreateBitmap
を使ってあげます。
input.safeConfig
も修正方法はすごく簡単で代わりにinput.config
を使うだけでエラーは解消されます。
最後に
ただurlを基にコピペするだけではないので、備忘録&メモ帳くらいの感覚で記事にさせていただきました。
coil
は本当によく使うライブラリなので、今後の自分のためにもなると思いますし、皆さんのお役に立てれば光栄です。