🔥

Jetpack Compose Crop Image with Pinch Zoom

2025/01/21に公開

CanHub/Android-Image-Cropper is not addopt pinch zoom. So Yalantis/uCrop is a cropper with pinch zoom.

import android.app.Activity
import android.content.Intent
import android.net.Uri
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
import com.yalantis.ucrop.UCrop

@Composable
fun CropImageHandler() {
    val context = LocalContext.current
    var resultUri by remember { mutableStateOf<Uri?>(null) }
    var cropError by remember { mutableStateOf<Throwable?>(null) }

    val cropLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.let { data ->
                resultUri = UCrop.getOutput(data)
            }
        } else if (result.resultCode == UCrop.RESULT_ERROR) {
            result.data?.let { data ->
                cropError = UCrop.getError(data)
            }
        }
    }

    Button(onClick = {
        val sourceUri = /* uri from image picker result */
        val destinationUri = Uri.fromFile(File(context.cacheDir, "cropped_image.jpg"))
        val uCrop = UCrop.of(sourceUri, destinationUri)
            .withAspectRatio(1f, 1f)
            .withMaxResultSize(512, 512)
        cropLauncher.launch(uCrop.getIntent(context))
    }) {
        Text("Crop")
    }

    resultUri?.let {
        // do something with cropped image

    }

    cropError?.let {
        // error handling

    }
}

ArthurHub/Android-Image-Cropper (Canhub's librariy is fork of this) author said

I don't want to add pinching as it may confuse and there is already a library with that: uCrop.
https://github.com/ArthurHub/Android-Image-Cropper/issues/123

Discussion