Optimize media: Compress Png to Png.

This commit is contained in:
Benoit Marty 2024-10-31 11:04:11 +01:00
parent ea73ee0481
commit 9f0461166e
2 changed files with 13 additions and 2 deletions

View file

@ -125,6 +125,7 @@ class AndroidMediaPreProcessor @Inject constructor(
val compressionResult = imageCompressor.compressToTmpFile( val compressionResult = imageCompressor.compressToTmpFile(
inputStreamProvider = { contentResolver.openInputStream(uri)!! }, inputStreamProvider = { contentResolver.openInputStream(uri)!! },
resizeMode = ResizeMode.Approximate(IMAGE_SCALE_REF_SIZE, IMAGE_SCALE_REF_SIZE), resizeMode = ResizeMode.Approximate(IMAGE_SCALE_REF_SIZE, IMAGE_SCALE_REF_SIZE),
mimeType = mimeType,
orientation = orientation, orientation = orientation,
).getOrThrow() ).getOrThrow()
val thumbnailResult = thumbnailFactory.createImageThumbnail(compressionResult.file) val thumbnailResult = thumbnailFactory.createImageThumbnail(compressionResult.file)

View file

@ -16,6 +16,7 @@ import io.element.android.libraries.androidutils.bitmap.resizeToMax
import io.element.android.libraries.androidutils.bitmap.rotateToMetadataOrientation import io.element.android.libraries.androidutils.bitmap.rotateToMetadataOrientation
import io.element.android.libraries.androidutils.file.createTmpFile import io.element.android.libraries.androidutils.file.createTmpFile
import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.ApplicationContext
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
@ -34,14 +35,23 @@ class ImageCompressor @Inject constructor(
suspend fun compressToTmpFile( suspend fun compressToTmpFile(
inputStreamProvider: () -> InputStream, inputStreamProvider: () -> InputStream,
resizeMode: ResizeMode, resizeMode: ResizeMode,
format: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG, mimeType: String,
orientation: Int = ExifInterface.ORIENTATION_UNDEFINED, orientation: Int = ExifInterface.ORIENTATION_UNDEFINED,
desiredQuality: Int = 78, desiredQuality: Int = 78,
): Result<ImageCompressionResult> = withContext(dispatchers.io) { ): Result<ImageCompressionResult> = withContext(dispatchers.io) {
runCatching { runCatching {
val format = when (mimeType) {
MimeTypes.Png -> Bitmap.CompressFormat.PNG
else -> Bitmap.CompressFormat.JPEG
}
val extension = when (mimeType) {
MimeTypes.Png -> "png"
else -> "jpeg"
}
val compressedBitmap = compressToBitmap(inputStreamProvider, resizeMode, orientation).getOrThrow() val compressedBitmap = compressToBitmap(inputStreamProvider, resizeMode, orientation).getOrThrow()
// Encode bitmap to the destination temporary file // Encode bitmap to the destination temporary file
val tmpFile = context.createTmpFile(extension = "jpeg") val tmpFile = context.createTmpFile(extension = extension)
tmpFile.outputStream().use { tmpFile.outputStream().use {
compressedBitmap.compress(format, desiredQuality, it) compressedBitmap.compress(format, desiredQuality, it)
} }