| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function convertVideoFrameToImageData( |
| | videoFrame: VideoFrame, |
| | ): ImageData | undefined { |
| | const canvas = new OffscreenCanvas( |
| | videoFrame.displayWidth, |
| | videoFrame.displayHeight, |
| | ); |
| | const ctx = canvas.getContext('2d'); |
| | ctx?.drawImage(videoFrame, 0, 0); |
| | return ctx?.getImageData(0, 0, canvas.width, canvas.height); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | export function findBoundingBox() { |
| | let xMin = Number.MAX_VALUE; |
| | let yMin = Number.MAX_VALUE; |
| | let xMax = Number.MIN_VALUE; |
| | let yMax = Number.MIN_VALUE; |
| | return { |
| | process: function (x: number, y: number, hasData: boolean) { |
| | if (hasData) { |
| | xMin = Math.min(x, xMin); |
| | xMax = Math.max(x, xMax); |
| | yMin = Math.min(y, yMin); |
| | yMax = Math.max(y, yMax); |
| | } |
| | return [xMin, xMax, yMin, yMax]; |
| | }, |
| | crop(imageData: ImageData): ImageData | null { |
| | const canvas = new OffscreenCanvas(imageData.width, imageData.height); |
| | const ctx = canvas.getContext('2d'); |
| |
|
| | const boundingBoxWidth = xMax - xMin; |
| | const boundingBoxHeight = yMax - yMin; |
| | if (ctx && boundingBoxWidth > 0 && boundingBoxHeight > 0) { |
| | ctx.clearRect(0, 0, canvas.width, canvas.height); |
| | ctx.putImageData(imageData, 0, 0); |
| | return ctx.getImageData( |
| | xMin, |
| | yMin, |
| | boundingBoxWidth, |
| | boundingBoxHeight, |
| | ); |
| | } else { |
| | return null; |
| | } |
| | }, |
| | getBox(): [[number, number], [number, number]] { |
| | return [ |
| | [xMin, yMin], |
| | [xMax, yMax], |
| | ]; |
| | }, |
| | }; |
| | } |
| |
|
| | export function magnifyImageRegion( |
| | canvas: HTMLCanvasElement | null, |
| | x: number, |
| | y: number, |
| | radius: number = 25, |
| | scale: number = 2, |
| | ): string { |
| | if (canvas == null) { |
| | return ''; |
| | } |
| | const ctx = canvas.getContext('2d'); |
| | if (ctx) { |
| | const minX = x - radius < 0 ? radius - x : 0; |
| | const minY = y - radius < 0 ? radius - y : 0; |
| | const region = ctx.getImageData( |
| | Math.max(x - radius, 0), |
| | Math.max(y - radius, 0), |
| | radius * 2, |
| | radius * 2, |
| | ); |
| |
|
| | |
| | |
| | const regionCanvas = new OffscreenCanvas(region.width, region.height); |
| | const regionCtx = regionCanvas.getContext('2d'); |
| | regionCtx?.putImageData(region, minX > 0 ? minX : 0, minY > 0 ? minY : 0); |
| |
|
| | const scaleCanvas = document.createElement('canvas'); |
| | scaleCanvas.width = Math.round(region.width * scale); |
| | scaleCanvas.height = Math.round(region.height * scale); |
| | const scaleCtx = scaleCanvas.getContext('2d'); |
| | scaleCtx?.scale(scale, scale); |
| | scaleCtx?.drawImage(regionCanvas, 0, 0); |
| |
|
| | return scaleCanvas.toDataURL(); |
| | } |
| | return ''; |
| | } |
| |
|