|
"use client" |
|
|
|
import { createWorker } from "tesseract.js" |
|
import { loadImageToCanvas } from "./loadImageToCanvas"; |
|
|
|
export async function replaceTextInSpeechBubbles(image: string, customText: string) { |
|
console.log('creating OCR worker to find bubbles inside', image); |
|
|
|
const worker = await createWorker({ |
|
logger: (info) => { |
|
console.log(info) |
|
}, |
|
}); |
|
|
|
const canvas = await loadImageToCanvas(image) |
|
|
|
const ctx = canvas.getContext('2d')!; |
|
|
|
try { |
|
await worker.load(); |
|
await worker.loadLanguage('eng'); |
|
await worker.initialize('eng'); |
|
|
|
const { data } = await worker.recognize(canvas); |
|
const lines = data.lines || []; |
|
|
|
|
|
ctx.fillStyle = "white"; |
|
|
|
lines.forEach((line) => { |
|
ctx.fillRect(line.bbox.x0, line.bbox.y0, line.bbox.x1 - line.bbox.x0, line.bbox.y1 - line.bbox.y0); |
|
|
|
const bubbleWidth = line.bbox.x1 - line.bbox.x0; |
|
const bubbleHeight = line.bbox.y1 - line.bbox.y0; |
|
let fontSize = 18; |
|
ctx.font = `${fontSize}px Arial`; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
await worker.terminate(); |
|
|
|
|
|
const imgAsDataURL = canvas.toDataURL('image/png'); |
|
|
|
if (typeof window !== "undefined") { |
|
const foo = (window as any) |
|
if (!foo.debugJujul) { |
|
foo.debugJujul = [] |
|
} |
|
foo.debugJujul.push({ |
|
lines |
|
}) |
|
} |
|
console.log("lines:", lines) |
|
|
|
return imgAsDataURL; |
|
|
|
} catch (err) { |
|
console.error(err); |
|
} |
|
return ""; |
|
} |
|
|
|
function wrapText(context: CanvasRenderingContext2D, text: string, x: number, y: number, maxWidth: number, lineHeight: number) { |
|
const words = text.split(' '); |
|
let line = ''; |
|
const lines = []; |
|
|
|
for(let n = 0; n < words.length; n++) { |
|
let testLine = line + words[n] + ' '; |
|
let metrics = context.measureText(testLine); |
|
let testWidth = metrics.width; |
|
if (testWidth > maxWidth && n > 0) { |
|
lines.push(line); |
|
line = words[n] + ' '; |
|
} |
|
else { |
|
line = testLine; |
|
} |
|
} |
|
lines.push(line); |
|
return lines; |
|
} |