Fix IndexOutOfBoundsException when using Split tall images (#7892)

Also little cleanup
This commit is contained in:
AntsyLich 2022-08-29 23:02:34 +06:00 committed by GitHub
parent 0e526c36be
commit b79340989f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 12 deletions

View file

@ -32,7 +32,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter<RecyclerV
val placeAtIndex = items.indexOf(currentStrip) + 1 val placeAtIndex = items.indexOf(currentStrip) + 1
// Stop constantly adding split images // Stop constantly adding split images
if (items[placeAtIndex] is StencilPage) return if (items.getOrNull(placeAtIndex) is StencilPage) return
val updatedItems = items.toMutableList() val updatedItems = items.toMutableList()
updatedItems.addAll(placeAtIndex, newStrips) updatedItems.addAll(placeAtIndex, newStrips)

View file

@ -223,7 +223,7 @@ object ImageUtil {
splitDataList.forEach { splitData -> splitDataList.forEach { splitData ->
val splitPath = splitImagePath(imageFilePath, splitData.index) val splitPath = splitImagePath(imageFilePath, splitData.index)
val region = Rect(0, splitData.topOffset, splitData.outputImageWidth, splitData.bottomOffset) val region = Rect(0, splitData.topOffset, splitData.splitWidth, splitData.bottomOffset)
FileOutputStream(splitPath).use { outputStream -> FileOutputStream(splitPath).use { outputStream ->
val splitBitmap = bitmapRegionDecoder.decodeRegion(region, options) val splitBitmap = bitmapRegionDecoder.decodeRegion(region, options)
@ -232,7 +232,7 @@ object ImageUtil {
} }
logcat { logcat {
"Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} " + "Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} " +
"height=${splitData.outputImageHeight} bottomOffset=${splitData.bottomOffset}" "height=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}"
} }
} }
imageFile.delete() imageFile.delete()
@ -274,15 +274,13 @@ object ImageUtil {
logcat { logcat {
"WebtoonSplit #${splitData.index} with topOffset=${splitData.topOffset} " + "WebtoonSplit #${splitData.index} with topOffset=${splitData.topOffset} " +
"outputImageHeight=${splitData.outputImageHeight} bottomOffset=${splitData.bottomOffset}" "splitHeight=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}"
} }
val options = extractImageOptions(imageStream).apply { inJustDecodeBounds = false } val region = Rect(0, splitData.topOffset, splitData.splitWidth, splitData.bottomOffset)
val region = Rect(0, splitData.topOffset, splitData.outputImageWidth, splitData.bottomOffset)
try { try {
val splitBitmap = bitmapRegionDecoder.decodeRegion(region, options) val splitBitmap = bitmapRegionDecoder.decodeRegion(region, null)
val outputStream = ByteArrayOutputStream() val outputStream = ByteArrayOutputStream()
splitBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) splitBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
return ByteArrayInputStream(outputStream.toByteArray()) return ByteArrayInputStream(outputStream.toByteArray())
@ -302,7 +300,7 @@ object ImageUtil {
val imageHeight = outHeight val imageHeight = outHeight
val imageWidth = outWidth val imageWidth = outWidth
val splitHeight = (getDisplayMaxHeightInPx * 1.5).toInt() val splitHeight = getDisplayMaxHeightInPx * 2
// -1 so it doesn't try to split when imageHeight = splitHeight // -1 so it doesn't try to split when imageHeight = splitHeight
val partCount = (imageHeight - 1) / splitHeight + 1 val partCount = (imageHeight - 1) / splitHeight + 1
val optimalSplitHeight = imageHeight / partCount val optimalSplitHeight = imageHeight / partCount
@ -334,10 +332,10 @@ object ImageUtil {
data class SplitData( data class SplitData(
val index: Int, val index: Int,
val topOffset: Int, val topOffset: Int,
val outputImageHeight: Int, val splitHeight: Int,
val outputImageWidth: Int, val splitWidth: Int,
) { ) {
val bottomOffset = topOffset + outputImageHeight val bottomOffset = topOffset + splitHeight
} }
/** /**