From a598f39deaae471f854419c42227064b6f293437 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Fri, 20 Dec 2024 22:05:51 -0500 Subject: [PATCH] musikr.cover: use jpeg for covers Way faster to encode and the artifacts are minimal at 1kx1k and 100 compression. Still not fully ideal, but webp is so flow to encode. --- .../org/oxycblt/musikr/cover/CoverFiles.kt | 2 +- .../org/oxycblt/musikr/cover/CoverFormat.kt | 47 +++++++++++-------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt index e7cae0b48..5a3f99569 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt @@ -35,7 +35,7 @@ interface CoverFiles { companion object { fun at(context: Context, path: String): CoverFiles = - CoverFilesImpl(File(context.filesDir, path).also { it.mkdirs() }, CoverFormat.webp()) + CoverFilesImpl(File(context.filesDir, path).also { it.mkdirs() }, CoverFormat.jpeg()) } } diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt index 0018d609b..3ff9dba06 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + package org.oxycblt.musikr.cover import android.graphics.Bitmap @@ -29,21 +29,42 @@ internal interface CoverFormat { fun transcodeInto(data: ByteArray, output: OutputStream): Boolean companion object { - fun webp(): CoverFormat = WebpCoverFormat() + // Enable if perhaps you want to try other formats. + // Currently this is just far too slow. +// fun webp(): CoverFormat = CoverFormatImpl( +// "webp", +// 750, +// 80, +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// Bitmap.CompressFormat.WEBP_LOSSY +// } else { +// Bitmap.CompressFormat.WEBP +// } +// ) + + fun jpeg(): CoverFormat = CoverFormatImpl( + "jpg", + 1000, + 100, + Bitmap.CompressFormat.JPEG + ) } } -private class WebpCoverFormat() : CoverFormat { - override val extension = EXTENSION - +private class CoverFormatImpl( + override val extension: String, + val size: Int, + val quality: Int, + val format: Bitmap.CompressFormat, +) : CoverFormat { override fun transcodeInto(data: ByteArray, output: OutputStream) = BitmapFactory.Options().run { inJustDecodeBounds = true BitmapFactory.decodeByteArray(data, 0, data.size, this) - inSampleSize = calculateInSampleSize(SIZE) + inSampleSize = calculateInSampleSize(size) inJustDecodeBounds = false val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size, this) ?: return@run false - bitmap.compress(FORMAT, QUALITY, output) + bitmap.compress(format, quality, output) true } @@ -60,16 +81,4 @@ private class WebpCoverFormat() : CoverFormat { } return inSampleSize } - - private companion object { - const val SIZE = 750 - val FORMAT = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - Bitmap.CompressFormat.WEBP_LOSSY - } else { - Bitmap.CompressFormat.WEBP - } - const val QUALITY = 80 - const val EXTENSION = "webp" - } }