Как сохранить размытый JPEG в приложении Android Compose (COIL3)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как сохранить размытый JPEG в приложении Android Compose (COIL3)

Сообщение Anonymous »

Мое текущее приложение для Android имеет usecase, которая позволяет пользователям выбирать любой файл изображения JPEG и устанавливать его в качестве фона приложений.@Composable
fun ManipulateImage() {
var blurRadius by remember { mutableStateOf(1.dp) }
Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) {
AsyncImage(
model = R.drawable.app_background,
contentScale = ContentScale.Fit,
modifier = Modifier
.size(400.dp)
.blur(blurRadius, edgeTreatment = BlurredEdgeTreatment.Rectangle),
placeholder = painterResource(R.drawable.ic_android_black_24dp),
contentDescription = "stringResource(R.string.description)"
)

Slider(
value = blurRadius.value,
onValueChange = {
blurRadius = it.dp
println("xxooxx $blurRadius")
},
valueRange = 0.0F..10.0F,
steps = 11,
onValueChangeFinished = {
// Optional: Handle slider value change finished
},
modifier = Modifier.padding(16.dp)
)

}
}
< /code>
Это работает по мере необходимости, однако теперь мне нужно иметь возможность сохранить эту «размытую» версию файла JPEG в приложения Private Storage. < /p>
Я не вижу никакого способа достичь этого, хотя < /p>
можно извлечь в Blurred -версию изображения Jpeg из Asyncimage? Это GraphicsLayer.toImageBitmap () и работает нормально, кроме скопированного размера изображения, не соответствует исходному изображению, он вместо этого берет свои размеры из отображаемого изображения. Есть ли в любом случае graphicslayer.toimagebitmap () может создать «размытую копию», которая соответствует исходному размеру изображения и аспекту и т. Д. ...
Вот мой текущий код взлома, который приближает меня к желаемому результату
val context = LocalContext.current
var blurRadius by remember { mutableStateOf(1.dp) }
var darkenBy by remember { mutableStateOf(0.7F) }
val coroutineScope = rememberCoroutineScope()
val graphicsLayer = rememberGraphicsLayer()

val cm = ColorMatrix(floatArrayOf(
darkenBy, 0f, 0f, 0f, 0f,
0f, darkenBy, 0f, 0f, 0f,
0f, 0f, darkenBy, 0f, 0f,
0f, 0f, 0f, 1f, 0f
))
val filter = ColorMatrixColorFilter(cm)

Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Top) {
AsyncImage(
model = R.drawable.app_background,
contentScale = ContentScale.Fit,
modifier = Modifier
.size(200.dp)
.blur(blurRadius, edgeTreatment = BlurredEdgeTreatment.Rectangle),
placeholder = painterResource(R.drawable.ic_android_black_24dp),
contentDescription = "stringResource(R.string.description)"
)

Slider(
value = blurRadius.value,
onValueChange = {
blurRadius = it.dp
println("xxooxx $blurRadius")
},
valueRange = 0.0F..10.0F,
steps = 11,
onValueChangeFinished = {
// Optional: Handle slider value change finished
},
modifier = Modifier.padding(16.dp)
)
AsyncImage(
model = R.drawable.app_background,
contentScale = ContentScale.Fit,
modifier = Modifier
.size(200.dp).drawWithCache {
onDrawWithContent {
graphicsLayer.record {
this@onDrawWithContent.drawContent()
}
drawLayer(graphicsLayer)
}
},
placeholder = painterResource(R.drawable.ic_android_black_24dp),
contentDescription = "stringResource(R.string.description)",
colorFilter = filter
)

Slider(
value = darkenBy,
onValueChange = {
darkenBy = it
println("xxooxx $darkenBy")
},
valueRange = 0.0F..1.0F,
onValueChangeFinished = {
// Optional: Handle slider value change finished
},
modifier = Modifier.padding(16.dp)
)

Button(onClick = {
coroutineScope.launch {
val bitmap = graphicsLayer.toImageBitmap()
bitmap.asAndroidBitmap().saveToDisk(context)
}
}) { }

}
< /code>
Для сохранения на диск я использую этот код < /p>
private suspend fun Bitmap.saveToDisk(context: Context) {
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"screenshot-${System.currentTimeMillis()}.jpg"
)

file.writeBitmap(this, Bitmap.CompressFormat.JPEG, 100)
}

private fun File.writeBitmap(bitmap: Bitmap, format: Bitmap.CompressFormat, quality: Int) {
outputStream().use { out ->
bitmap.compress(format, quality, out)
out.flush()
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»