import type { Frame, Point } from 'react-native-vision-camera'; export function getImageRotation(frameOrientation: string) { 'worklet'; switch (frameOrientation) { case 'portrait': return 0; case 'landscape-left': return 90; case 'landscape-right': return 270; case 'portrait-upside-down': return 180; default: return 0; } } export function getImageRotationToResize( frame: Frame ): '0deg' | '90deg' | '180deg' | '270deg' { 'worklet'; return `${getImageRotation(frame.orientation)}deg`; } type Size = { width: number; height: number; }; export function getPointConverter( originalSize: Size, appDimension: Size, cameraDimension: Size, cameraType: 'front' | 'back', screenScale: number, isMirrored: boolean ) { const scaledScreenSize: { width: number; height: number } = { width: appDimension.width * screenScale, height: appDimension.height * screenScale, }; const frameScreenScale: Point = { x: originalSize.width / scaledScreenSize.width, y: originalSize.height / scaledScreenSize.height, }; const frameSquareDiff = Math.abs(originalSize.width - originalSize.height); const screenSquareDiff = frameSquareDiff / frameScreenScale.y; const scale: Point = { x: originalSize.width / frameScreenScale.y, y: cameraDimension.height * screenScale - screenSquareDiff, }; const diff: Point = { x: (originalSize.width / frameScreenScale.y - scaledScreenSize.width) / 2, y: screenSquareDiff / 2, }; const mirrorX = cameraType === 'front' ? !isMirrored : isMirrored; return function recalculatePoint(point: Point): Point { const newPoint = { x: point.x, y: point.y, }; const kX = mirrorX ? 1 - newPoint.x : newPoint.x; newPoint.x = kX * scale.x - diff.x; newPoint.y = newPoint.y * scale.y + diff.y; newPoint.x /= screenScale; newPoint.y /= screenScale; return newPoint; }; }