quadscan

Example

Manual corner correction

Auto-detect, then drag the four handles to fine-tune. The warped preview updates live.

Source - drag the four handles
Live preview
Source code for this example
import { Quadscan } from 'quadscan';

const q = new Quadscan();
const src = document.getElementById('src') as HTMLCanvasElement;
const out = document.getElementById('out') as HTMLCanvasElement;
let img: ImageBitmap;
let corners: CornerPoints;

async function onPick(file: File) {
  img = await createImageBitmap(file);
  src.width = img.width;
  src.height = img.height;
  // Detect once.
  const r = await q.scan(src, { mode: 'detect' });
  if (!r.success) return;
  corners = r.corners;
  redraw();
}

// Drag handles update `corners`; re-extract on every move.
async function redraw() {
  src.getContext('2d').drawImage(img, 0, 0);
  // ...draw handles...
  const r = await q.extract(src, corners);
  out.width = r.output.width;
  out.height = r.output.height;
  out.getContext('2d').drawImage(r.output, 0, 0);
}