You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.1 KiB
84 lines
2.1 KiB
2 months ago
|
package example.imageviewer.utils
|
||
|
|
||
|
import org.jetbrains.skia.Bitmap
|
||
|
import org.jetbrains.skia.Canvas
|
||
|
import org.jetbrains.skia.ColorAlphaType
|
||
|
import org.jetbrains.skia.ColorInfo
|
||
|
import org.jetbrains.skia.ColorType
|
||
|
import org.jetbrains.skia.FilterTileMode
|
||
|
import org.jetbrains.skia.Image
|
||
|
import org.jetbrains.skia.ImageFilter
|
||
|
import org.jetbrains.skia.ImageInfo
|
||
|
import org.jetbrains.skia.Paint
|
||
|
|
||
|
fun scaleBitmapAspectRatio(
|
||
|
bitmap: Bitmap,
|
||
|
width: Int,
|
||
|
height: Int
|
||
|
): Bitmap {
|
||
|
val boundWidth = width.toFloat()
|
||
|
val boundHeight = height.toFloat()
|
||
|
|
||
|
val ratioX = boundWidth / bitmap.width
|
||
|
val ratioY = boundHeight / bitmap.height
|
||
|
val ratio = if (ratioX < ratioY) ratioX else ratioY
|
||
|
|
||
|
val resultWidth = (bitmap.width * ratio).toInt()
|
||
|
val resultHeight = (bitmap.height * ratio).toInt()
|
||
|
|
||
|
val result = Bitmap().apply {
|
||
|
allocN32Pixels(resultWidth, resultHeight)
|
||
|
}
|
||
|
val canvas = Canvas(result)
|
||
|
canvas.drawImageRect(Image.makeFromBitmap(bitmap), result.bounds.toRect())
|
||
|
canvas.readPixels(result, 0, 0)
|
||
|
canvas.close()
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
fun applyGrayScaleFilter(bitmap: Bitmap): Bitmap {
|
||
|
val imageInfo = ImageInfo(
|
||
|
width = bitmap.width,
|
||
|
height = bitmap.height,
|
||
|
colorInfo = ColorInfo(ColorType.GRAY_8, ColorAlphaType.PREMUL, null)
|
||
|
)
|
||
|
val result = Bitmap().apply {
|
||
|
allocPixels(imageInfo)
|
||
|
}
|
||
|
|
||
|
val canvas = Canvas(result)
|
||
|
canvas.drawImageRect(Image.makeFromBitmap(bitmap), bitmap.bounds.toRect())
|
||
|
canvas.readPixels(result, 0, 0)
|
||
|
canvas.close()
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
fun applyPixelFilter(bitmap: Bitmap): Bitmap {
|
||
|
val width = bitmap.width
|
||
|
val height = bitmap.height
|
||
|
|
||
|
var result = scaleBitmapAspectRatio(bitmap, width / 4, height / 4)
|
||
|
result = scaleBitmapAspectRatio(result, width, height)
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
fun applyBlurFilter(bitmap: Bitmap): Bitmap {
|
||
|
val result = Bitmap().apply {
|
||
|
allocN32Pixels(bitmap.width, bitmap.height)
|
||
|
}
|
||
|
val blur = Paint().apply {
|
||
|
imageFilter = ImageFilter.makeBlur(3f, 3f, FilterTileMode.CLAMP)
|
||
|
}
|
||
|
|
||
|
val canvas = Canvas(result)
|
||
|
canvas.saveLayer(null, blur)
|
||
|
canvas.drawImageRect(Image.makeFromBitmap(bitmap), bitmap.bounds.toRect())
|
||
|
canvas.restore()
|
||
|
canvas.readPixels(result, 0, 0)
|
||
|
canvas.close()
|
||
|
|
||
|
return result
|
||
|
}
|