File size: 2,861 Bytes
1a07bca
 
 
b0980c1
 
1a07bca
 
177439e
1a07bca
 
177439e
1a07bca
 
 
 
 
 
 
 
 
 
 
 
 
bf1c6a2
1a07bca
bf1c6a2
1a07bca
 
bf1c6a2
 
 
177439e
bf1c6a2
 
 
 
 
 
1a07bca
 
bf1c6a2
1a07bca
 
 
 
177439e
1a07bca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bf1c6a2
177439e
bf1c6a2
177439e
bf1c6a2
 
1a07bca
 
 
 
 
 
 
 
 
 
 
 
 
 
bf1c6a2
 
1a07bca
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import React, { useRef, useEffect, useState } from "react";
import { StyleSheet, View, Button, Alert } from "react-native";
import { Camera, useCameraDevices } from "react-native-vision-camera";
import * as ImageManipulator from "expo-image-manipulator";

const App = () => {
  const [hasPermission, setHasPermission] = useState(false);
  const [cameraType, setCameraType] = useState("back"); // Default to rear camera
  const camera = useRef(null);
  const devices = useCameraDevices();
  const device = cameraType === "back" ? devices.back : devices.front;

  useEffect(() => {
    (async () => {
      const status = await Camera.requestCameraPermission();
      setHasPermission(status === "authorized");
    })();
  }, []);

  const captureImage = async () => {
    if (!camera.current) return;

    try {
      const photo = await camera.current.takePhoto({
        quality: 0.8, // Adjust quality as needed
      });

      console.log("Captured Image Path:", photo.path);

      // Correct image orientation for the rear camera
      const fixedImage = await ImageManipulator.manipulateAsync(
        photo.path,
        [{ flip: cameraType === "back" ? ImageManipulator.FlipType.Horizontal : undefined }], // Flip for rear camera
        { compress: 1, format: ImageManipulator.SaveFormat.JPEG }
      );

      console.log("Fixed Image Path:", fixedImage.uri);

      // Send the fixed image to the backend
      const formData = new FormData();
      formData.append("file", {
        uri: fixedImage.uri,
        type: "image/jpeg",
        name: "photo.jpg",
      });

      const response = await fetch("https://<your-gradio-backend-url>", {
        method: "POST",
        body: formData,
      });
      const data = await response.json();
      Alert.alert("OCR Result", data || "No text detected.");
    } catch (error) {
      console.error("Error capturing image:", error);
      Alert.alert("Error", "Failed to capture image. Please try again.");
    }
  };

  if (!device || !hasPermission) return <View style={styles.container} />;

  return (
    <View style={styles.container}>
      <Camera
        ref={camera}
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
        photo={true}
      />
      <View style={styles.buttonContainer}>
        <Button
          title={`Switch to ${cameraType === "back" ? "Front" : "Rear"} Camera`}
          onPress={() =>
            setCameraType((prev) => (prev === "back" ? "front" : "back"))
          }
        />
        <Button title="Capture Image" onPress={captureImage} />
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  buttonContainer: {
    position: "absolute",
    bottom: 20,
    width: "100%",
    flexDirection: "row",
    justifyContent: "space-evenly",
  },
});

export default App;