let canvas; let ctx; document.addEventListener("DOMContentLoaded", () => { canvas = document.getElementById("drawingCanvas"); ctx = canvas.getContext("2d"); let isDrawing = false; canvas.addEventListener("mousedown", () => isDrawing = true); canvas.addEventListener("mouseup", () => isDrawing = false); canvas.addEventListener("mousemove", draw); function draw(event) { if (!isDrawing) return; ctx.fillStyle = "black"; ctx.fillRect(event.offsetX, event.offsetY, 20, 20); } }); function clearCanvas() { ctx.clearRect(0, 0, canvas.width, canvas.height); document.getElementById("result").innerText = ""; } // Inverting the images as the training images had a black background with white text, // opposite of what we get from the canvas function invertCanvasColors(inputCanvas) { const tempCanvas = document.createElement("canvas"); const tempCtx = tempCanvas.getContext("2d"); // Set the size of the temporary canvas to match the original canvas tempCanvas.width = inputCanvas.width; tempCanvas.height = inputCanvas.height; // Draw the original canvas onto the temporary canvas tempCtx.drawImage(inputCanvas, 0, 0); // Get the pixel data of the image const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height); const data = imageData.data; // Invert each pixel's RGB values for (let i = 0; i < data.length; i += 4) { data[i] = 255 - data[i]; // Red channel data[i + 1] = 255 - data[i + 1]; // Green channel data[i + 2] = 255 - data[i + 2]; // Blue channel } tempCtx.putImageData(imageData, 0, 0); return tempCanvas; } function sendToServer() { const invertedCanvas = invertCanvasColors(canvas); let image = invertedCanvas.toDataURL("image/png"); let blob = dataURItoBlob(image); let formData = new FormData(); formData.append("image", blob, "drawing.png"); fetch("https://ramachandrankulothungan-digit-doodle-recognition.hf.space/predict", { method: "POST", body: formData }) .then(response => response.json()) .then(data => document.getElementById("result").innerText = "Prediction: " + data.prediction) .catch(error => console.error("Error:", error)); } function dataURItoBlob(dataURI) { let byteString = atob(dataURI.split(",")[1]); let arrayBuffer = new ArrayBuffer(byteString.length); let uint8Array = new Uint8Array(arrayBuffer); for (let i = 0; i < byteString.length; i++) { uint8Array[i] = byteString.charCodeAt(i); } return new Blob([uint8Array], { type: "image/png" }); }