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