import { CameraCapturedPicture } from "expo-camera"; import { ImageManipulator, SaveFormat } from "expo-image-manipulator"; import { Dimensions } from "react-native"; const deviceWidth = Dimensions.get("window").width; const deviceHeight = Dimensions.get("window").height; // Kılavuz çerçevesinin boyutları (Tailwind: h-40 = 160px) const scanningAreaHeight = 160; // h-40 export async function cropImage(data: CameraCapturedPicture) { const image = ImageManipulator.manipulate(data.uri); // Kamera görüntüsünün aspect ratio'su const imageAspectRatio = data.width / data.height; // Ekrandaki kamera view'ının boyutları (mx-2 = 8px*2, p-2 = 8px*2, header vs. için yaklaşık hesap) const cameraViewWidth = deviceWidth - 16; // mx-2 margins const cameraViewHeight = deviceHeight - 300; // Header + controls için yaklaşık alan // Kamera view'ının aspect ratio'su const viewAspectRatio = cameraViewWidth / cameraViewHeight; // Kamera görüntüsünün ekranda nasıl göründüğünü hesapla (aspect ratio korunarak) let displayedImageHeight; if (imageAspectRatio > viewAspectRatio) { // Görüntü daha geniş, yükseklik sınırlayıcı displayedImageHeight = cameraViewHeight; } else { // Görüntü daha dar, genişlik sınırlayıcı displayedImageHeight = cameraViewWidth / imageAspectRatio; } // Kılavuz çerçevesinin gerçek görüntüdeki karşılığını hesapla const scaleY = data.height / displayedImageHeight; // Yatayda kırpma yok, tam genişlik kullan const photoWidth = data.width; // Tam genişlik const photoHeight = Math.round(scanningAreaHeight * scaleY); const crop = { originX: 0, // Yatayda kırpma yok originY: (data.height - photoHeight) / 2, width: photoWidth, height: photoHeight, }; image.crop(crop); const croppedImage = await image.renderAsync(); const croppedImageUri = ( await croppedImage.saveAsync({ format: SaveFormat.PNG }) ).uri; return croppedImageUri; }