Fix IndexOutOfBoundsException when using Split tall images (#7892)
Also little cleanup
This commit is contained in:
parent
0e526c36be
commit
b79340989f
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user