TrimTransformation for images

This commit is contained in:
Koitharu
2022-07-04 13:48:40 +03:00
parent 4a7b415635
commit b7f469957c
2 changed files with 99 additions and 0 deletions

View File

@@ -29,6 +29,9 @@ val uiModule
ImageLoader.Builder(androidContext())
.okHttpClient(httpClientFactory)
.interceptorDispatcher(Dispatchers.Default)
.fetcherDispatcher(Dispatchers.IO)
.decoderDispatcher(Dispatchers.Default)
.transformationDispatcher(Dispatchers.Default)
.diskCache(diskCacheFactory)
.components(
ComponentRegistry.Builder()

View File

@@ -0,0 +1,96 @@
package org.koitharu.kotatsu.utils.image
import android.graphics.Bitmap
import androidx.core.graphics.get
import coil.size.Size
import coil.transform.Transformation
class TrimTransformation : Transformation {
override val cacheKey: String = javaClass.name
override suspend fun transform(input: Bitmap, size: Size): Bitmap {
var left = 0
var top = 0
var right = 0
var bottom = 0
// Left
for (x in 0 until input.width) {
var isColBlank = true
val prevColor = input[x, 0]
for (y in 1 until input.height) {
if (input[x, y] != prevColor) {
isColBlank = false
break
}
}
if (isColBlank) {
left++
} else {
break
}
}
if (left == input.width) {
return input
}
// Right
for (x in (left until input.width).reversed()) {
var isColBlank = true
val prevColor = input[x, 0]
for (y in 1 until input.height) {
if (input[x, y] != prevColor) {
isColBlank = false
break
}
}
if (isColBlank) {
right++
} else {
break
}
}
// Top
for (y in 0 until input.height) {
var isRowBlank = true
val prevColor = input[0, y]
for (x in 1 until input.width) {
if (input[x, y] != prevColor) {
isRowBlank = false
break
}
}
if (isRowBlank) {
top++
} else {
break
}
}
// Bottom
for (y in (top until input.height).reversed()) {
var isRowBlank = true
val prevColor = input[0, y]
for (x in 1 until input.width) {
if (input[x, y] != prevColor) {
isRowBlank = false
break
}
}
if (isRowBlank) {
bottom++
} else {
break
}
}
return if (left != 0 || right != 0 || top != 0 || bottom != 0) {
Bitmap.createBitmap(input, left, top, input.width - left - right, input.height - top - bottom)
} else {
input
}
}
override fun equals(other: Any?) = other is TrimTransformation
override fun hashCode() = javaClass.hashCode()
}