| "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; |
| } |