[英]Image cropper in Jetpack Compose?
我到处搜索,但没有一个关于在 Jetpack Compose 中裁剪图像的文档
如何在 Jetpack Compose 中裁剪图像?
试试这个简单的作物!
Image(
painter = painterResource(id = R.drawable.blue_bg),
contentDescription = stringResource(R.string.background_image),
contentScale = ContentScale.Crop,
modifier = modifier
.fillMaxWidth()
.height(120.dp)
)
只要高度/宽度小于特定设备上的图像大小,它就可以按照高度(此示例)完美裁剪。
我今天尝试在 Jetpack Compose 中裁剪图像,实际上您可以使用那些较旧的 Android 库没问题。
我用过这个: https://github.com/CanHub/Android-Image-Cropper
项目build.gradle:
allprojects {
repositories {
google()
mavenCentral()
maven(url = "https://jitpack.io")
}
}
应用 build.gradle:
implementation("com.github.CanHub:Android-Image-Cropper:4.0.0")
用法:
@Composable
fun ImageSelectorAndCropper() {
var imageUri by remember {
mutableStateOf<Uri?>(null)
}
val context = LocalContext.current
val bitmap = remember {
mutableStateOf<Bitmap?>(null)
}
val imageCropLauncher = rememberLauncherForActivityResult(CropImageContract()) { result ->
if (result.isSuccessful) {
// use the cropped image
imageUri = result.uriContent
} else {
// an error occurred cropping
val exception = result.error
}
}
val imagePickerLauncher = rememberLauncherForActivityResult(contract = ActivityResultContracts.GetContent()) { uri: Uri? ->
val cropOptions = CropImageContractOptions(uri, CropImageOptions())
imageCropLauncher.launch(cropOptions)
}
if (imageUri != null) {
if (Build.VERSION.SDK_INT < 28) {
bitmap.value = MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri)
} else {
val source = ImageDecoder.createSource(context.contentResolver, imageUri!!)
bitmap.value = ImageDecoder.decodeBitmap(source)
}
Button(onClick = { imagePickerLauncher.launch("image/*") }) {
Text("Pick image to crop")
}
}
}
我为 Jetpack Compose 构建了一个,它可以使用 static、带有动画和自定义形状的动态覆盖以及许多自定义选项进行裁剪。
它处于 alpha 阶段,存在一些错误,并将优化一些功能并添加徒手裁剪。 它将在几天内准备好投入生产。
如果您想对其进行测试,请帮助解决问题,这是链接
https://github.com/SmartToolFactory/Compose-Cropper
@Composable
private fun MainContent(
cropProperties: CropProperties,
cropStyle: CropStyle,
onSelectionPageMenuClicked: (SelectionPage) -> Unit
) {
val imageBitmapLarge = ImageBitmap.imageResource(
LocalContext.current.resources,
R.drawable.landscape1
)
var imageBitmap by remember { mutableStateOf(imageBitmapLarge) }
var croppedImage by remember { mutableStateOf<ImageBitmap?>(null) }
var crop by remember { mutableStateOf(false) }
var showDialog by remember { mutableStateOf(false) }
var isCropping by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.DarkGray),
contentAlignment = Alignment.Center
) {
Column(modifier = Modifier.fillMaxSize()) {
ImageCropper(
modifier = Modifier.fillMaxWidth().weight(1f),
imageBitmap = imageBitmap,
contentDescription = "Image Cropper",
cropStyle = cropStyle,
cropProperties = cropProperties,
crop = crop,
onCropStart = {
isCropping = true
}
) {
croppedImage = it
isCropping = false
crop = false
showDialog = true
}
}
BottomAppBar(
modifier = Modifier.align(Alignment.BottomStart),
actions = {
IconButton(
onClick = {
onSelectionPageMenuClicked(SelectionPage.Properties)
}
) {
Icon(
Icons.Filled.Settings,
contentDescription = "Settings",
)
}
IconButton(
onClick = {
onSelectionPageMenuClicked(SelectionPage.Style)
}
) {
Icon(Icons.Filled.Brush, contentDescription = "Style")
}
IconButton(
onClick = { crop = true }) {
Icon(Icons.Filled.Crop, contentDescription = "Crop Image")
}
},
floatingActionButton = {
ImageSelectionButton(
elevation = FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp),
onImageSelected = { bitmap: ImageBitmap ->
imageBitmap = bitmap
}
)
}
)
if (isCropping) {
CircularProgressIndicator()
}
}
if (showDialog) {
croppedImage?.let {
ShowCroppedImageDialog(imageBitmap = it) {
showDialog = !showDialog
croppedImage = null
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.