callstack / react-native-image-editor

A library providing an API for cropping images from the web and the local file system.
MIT License
378 stars 118 forks source link

Crop result wrong on iOS 16.3 #163

Open jordam1407 opened 3 weeks ago

jordam1407 commented 3 weeks ago

Environment

Phisical Device: iPhone 13 Pro Max OS: iOS 16.2.7

Project: "react-native": "0.74.3", "@react-native-community/image-editor": "^4.2.0", "expo": "~51.0.23", "react-native-vision-camera": "^4.5.1",

Description

The crop result is outside what was expected

*This code works perfectly in all other devices/emulators and OS versions, for both Android, iOS.

This bug only happen when I got a picture from react native vision camera, when picked with expo-image-picker, it works fine!

The green toast in end of the video is: Original Image Height and Image Width

Image crop area Height and Width Position X and Y above the Image crop area

https://github.com/user-attachments/assets/ab1b5711-82ed-4dcc-88b7-6cec8b45e4f8

Reproducible Demo

  const handlePress = async () => {
    try {
      setTranscriptionLoading(true);
      const widthRatio = image.width / imageLayout.width;
      const heightRatio = image.height / imageLayout.height;

      const cropData: ImageCropData = {
        offset: { x: cropX.value * widthRatio, y: cropY.value * heightRatio },
        size: { width: cropWidth.value * widthRatio, height: cropHeight.value * heightRatio },
        resizeMode: "cover",
        format: "webp",
        quality: Platform.OS === "ios" ? 0.5 : 0.9,
        includeBase64: false,
      };

      const croppedImageUri: CropResult = await ImageEditor.cropImage(image.uri, cropData);

      handleTranscription(croppedImageUri);
    } catch (error) {
      console.error("Crop Error", error);
      Toast.show({ type: "error", text1: "Erro ao processar imagem" });
    }
  };
retyui commented 1 day ago

This bug only happen when I got a picture from react native vision camera, when picked with expo-image-picker, it works fine!

Thank you for reporting this problem. This workaround should assist to resolve it, as we have something similar on Android.