diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt index 6cff82b81..390459727 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt @@ -70,6 +70,7 @@ import com.hippo.ehviewer.ui.scene.GalleryDetailScene import com.hippo.ehviewer.ui.scene.GalleryListScene import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs import com.hippo.ehviewer.ui.scene.ProgressScene +import com.hippo.image.Image import com.hippo.util.addTextToClipboard import com.hippo.util.getClipboardManager import com.hippo.util.getUrlFromClipboard @@ -91,7 +92,7 @@ class MainActivity : EhActivity() { private fun saveImageToTempFile(uri: Uri): File? { val src = ImageDecoder.createSource(contentResolver, uri) - val bitmap = runCatching { ImageDecoder.decodeBitmap(src) }.getOrNull() ?: return null + val bitmap = runCatching { ImageDecoder.decodeBitmap(src, Image.imageSearchDecoderSampleListener) }.getOrNull() ?: return null val temp = AppConfig.createTempFile() ?: return null var os: OutputStream? = null return try { diff --git a/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java index 58fdf4ef4..d0822a5bd 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java @@ -37,6 +37,7 @@ import com.hippo.ehviewer.AppConfig; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.exception.EhException; +import com.hippo.image.Image; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.IOUtils; import com.hippo.yorozuya.ViewUtils; @@ -121,8 +122,7 @@ public final class ImageSearchLayout extends LinearLayout implements View.OnClic try { var src = ImageDecoder.createSource(context.getContentResolver(), imageUri); - Bitmap bitmap = ImageDecoder.decodeBitmap(src, ((imageDecoder, imageInfo, source) -> { - })); + Bitmap bitmap = ImageDecoder.decodeBitmap(src, Image.getImageSearchDecoderSampleListener()); if (null == bitmap) { return; } diff --git a/app/src/main/java/com/hippo/image/Image.kt b/app/src/main/java/com/hippo/image/Image.kt index bda43403c..96eead118 100644 --- a/app/src/main/java/com/hippo/image/Image.kt +++ b/app/src/main/java/com/hippo/image/Image.kt @@ -26,6 +26,7 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.os.Build import com.hippo.ehviewer.EhApplication +import com.hippo.ehviewer.R import java.nio.ByteBuffer import kotlin.math.min @@ -38,10 +39,7 @@ class Image private constructor(source: Source, private var src: ByteBufferSourc } decoder.setTargetColorSpace(colorSpace) decoder.setTargetSampleSize( - min( - info.size.width / (2 * screenWidth), - info.size.height / (2 * screenHeight) - ).coerceAtLeast(1) + calculateSampleSize(info, 2 * screenHeight, 2 * screenWidth) ) }.also { (it as? BitmapDrawable)?.run { @@ -65,6 +63,23 @@ class Image private constructor(source: Source, private var src: ByteBufferSourc } companion object { + fun calculateSampleSize(info: ImageInfo, targetHeight: Int, targetWeight: Int): Int { + return min( + info.size.width / targetWeight, + info.size.height / targetHeight + ).coerceAtLeast(1) + } + + private val imageSearchMaxSize = + EhApplication.application.resources.getDimensionPixelOffset(R.dimen.image_search_max_size) + + @JvmStatic + val imageSearchDecoderSampleListener = + ImageDecoder.OnHeaderDecodedListener { decoder, info, _ -> + decoder.setTargetSampleSize( + calculateSampleSize(info, imageSearchMaxSize, imageSearchMaxSize) + ) + } val screenWidth = EhApplication.application.resources.displayMetrics.widthPixels val screenHeight = EhApplication.application.resources.displayMetrics.heightPixels val isWideColorGamut =