From a68e7502763b4707f67de0ab488eb14991b3b18f Mon Sep 17 00:00:00 2001 From: zadit biasa aja <75159257+everythingonblack@users.noreply.github.com> Date: Tue, 1 Jul 2025 18:41:41 +0000 Subject: [PATCH] ok --- package-lock.json | 15 ++++++ package.json | 1 + public/index.html | 1 + src/KTPScanner.js | 116 +++++++++++++++++----------------------------- 4 files changed, 60 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index 274c3b3..e1bf11e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "js-levenshtein": "^1.1.6", "pixelmatch": "^7.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", @@ -10234,6 +10235,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14101,6 +14110,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", diff --git a/package.json b/package.json index 19f1efe..e1642e0 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "js-levenshtein": "^1.1.6", "pixelmatch": "^7.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", diff --git a/public/index.html b/public/index.html index aa069f2..632e247 100644 --- a/public/index.html +++ b/public/index.html @@ -24,6 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> + React App diff --git a/src/KTPScanner.js b/src/KTPScanner.js index 87fb74b..60c414b 100644 --- a/src/KTPScanner.js +++ b/src/KTPScanner.js @@ -1,8 +1,6 @@ import React, { useEffect, useRef, useState } from "react"; import Modal from "./Modal"; import PaginatedFormEditable from "./PaginatedFormEditable"; -import pixelmatch from "pixelmatch"; -import Tesseract from "tesseract.js"; const STORAGE_KEY = "camera_canvas_gallery"; @@ -41,35 +39,25 @@ const CameraCanvas = () => { }); }; - const isImageSimilar = (canvasA, canvasB) => { - const ctxA = canvasA.getContext("2d"); - const ctxB = canvasB.getContext("2d"); + // const isImageSimilar = (canvasA, canvasB) => { + // const ctxA = canvasA.getContext("2d"); + // const ctxB = canvasB.getContext("2d"); - const imgA = ctxA.getImageData(0, 0, canvasA.width, canvasA.height); - const imgB = ctxB.getImageData(0, 0, canvasB.width, canvasB.height); + // const imgA = ctxA.getImageData(0, 0, canvasA.width, canvasA.height); + // const imgB = ctxB.getImageData(0, 0, canvasB.width, canvasB.height); - const diffPixels = pixelmatch( - imgA.data, - imgB.data, - null, - canvasA.width, - canvasA.height, - { threshold: 0.5 } - ); + // const diffPixels = pixelmatch( + // imgA.data, + // imgB.data, + // null, + // canvasA.width, + // canvasA.height, + // { threshold: 0.5 } + // ); - const similarity = diffPixels / (canvasA.width * canvasA.height); - return similarity < 0.2; // you can adjust the threshold - }; - - const extractTextFromCanvas = async (canvas) => { - const dataUrl = canvas.toDataURL("image/png"); - - const result = await Tesseract.recognize(dataUrl, "ind", { - logger: (m) => console.log(m), // opsional: untuk melihat progress - }); - - return result.data.text; - }; + // const similarity = diffPixels / (canvasA.width * canvasA.height); + // return similarity < 0.2; // you can adjust the threshold + // }; const rectRef = useRef({ x: 0, @@ -235,49 +223,43 @@ const CameraCanvas = () => { const imageDataUrl = cropCanvas.toDataURL("image/png", 1.0); setCapturedImage(imageDataUrl); - // 👉 Load sample KTP and compare - const sampleKtpCanvas = await loadImageToCanvas( - "/ktp.jpeg", - cropCanvas.width, - cropCanvas.height - ); - - const isSimilar = isImageSimilar(cropCanvas, sampleKtpCanvas); - if (isSimilar) { - const extractedText = await extractTextFromCanvas(cropCanvas); - console.log("OCR Result:", extractedText); - - const lowercaseText = extractedText.toLowerCase(); - - if ( - lowercaseText.includes("provinsi") || - lowercaseText.includes("nik") || - lowercaseText.includes("kewarganegaraan") - ) { - setKTPdetected(true); - } else { - setKTPdetected(false); - } - } - + setKTPdetected(true); setLoading(false); // Continue to OCR etc... }; + function base64ToFile(base64Data, fileName) { + const arr = base64Data.split(","); + const mime = arr[0].match(/:(.*?);/)[1]; + const bstr = atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], fileName, { type: mime }); + } + const ReadImage = async (capturedImage) => { try { setLoading(true); const token = localStorage.getItem("token"); - let res = await fetch( + // Ubah base64 ke file + const file = base64ToFile(capturedImage, "image.jpg"); + + // Gunakan FormData + const formData = new FormData(); + formData.append("image", file); + + const res = await fetch( "https://bot.kediritechnopark.com/webhook/mastersnapper/read", { method: "POST", headers: { - "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, - body: JSON.stringify({ image: capturedImage }), + body: formData, } ); @@ -480,18 +462,7 @@ const CameraCanvas = () => { rectHeight ); - const ktpSample = new Image(); - ktpSample.src = "/ktp.jpeg"; - ktpSample.onload = () => { - const sampleCanvas = document.createElement("canvas"); - sampleCanvas.width = rectWidth; - sampleCanvas.height = rectHeight; - const sampleCtx = sampleCanvas.getContext("2d"); - sampleCtx.drawImage(ktpSample, 0, 0, rectWidth, rectHeight); - - const isSimilar = isImageSimilar(cropCanvas, sampleCanvas); - setKTPdetected(isSimilar); - }; + setKTPdetected(true); }; image.src = imageDataUrl; }; @@ -539,8 +510,9 @@ const CameraCanvas = () => { backgroundColor: "white", borderRadius: 16, textAlign: "center", - top: "-17px", - position: "relative", + bottom: 0, + width: "100%", + position: "absolute", padding: "20px", }} > @@ -588,9 +560,7 @@ const CameraCanvas = () => { capturedImage && !fileTemp && (
-

- KTP {!KTPdetected && "Tidak"} Terdeteksi -

+

Tinjau Gambar