UNPKG

canvas-select-plus

Version:

一款基于canvas的2D图像标注工具,在canvas-select的基础上,添加了清空、复制、撤销、重做、隐藏、显示和鼠标样式变化等功能,尚在开发和维护中...

503 lines (502 loc) 15.5 kB
import Rect from "./shape/Rect"; import Polygon from "./shape/Polygon"; import Dot from "./shape/Dot"; import EventBus from "./EventBus"; import Line from "./shape/Line"; import Circle from "./shape/Circle"; import Grid from "./shape/Grid"; import Brush from "./shape/Brush"; import Mask from "./shape/Mask"; import Pencil from "./shape/Pencil"; import BrushMask from "./shape/BrushMask"; export type Point = [number, number]; export type AllShape = Rect | Polygon | Dot | Line | Circle | Grid | Brush | Mask | Pencil | BrushMask; declare enum Shape { None = 0, Rect = 1, Polygon = 2, Dot = 3, Line = 4, Circle = 5, Grid = 6, Brush = 7, Mask = 8, Pencil = 9, BrushMask = 10 } interface MagicPoint { coor: [number, number]; color: string; } export default class CanvasSelect extends EventBus { /** 当前版本 */ version: string; /** 只读模式,画布不允许任何交互 */ lock: boolean; /** 只读模式,仅支持查看 */ readonly: boolean; /** 最小矩形宽度 */ MIN_WIDTH: number; /** 最小矩形高度 */ MIN_HEIGHT: number; /** 最小圆形半径 */ MIN_RADIUS: number; /** 最小轨迹点数 */ MIN_POINTNUM: number; /** 缩放图像的最小边长 */ MIN_LENGTH: number; /** 边线颜色 */ strokeStyle: string; /** 填充颜色 */ fillStyle: string; /** 边线宽度 */ lineWidth: number; /** 当前选中的标注边线颜色 */ activeStrokeStyle: string; /** 当前选中的标注填充颜色 */ activeFillStyle: string; /** 控制点边线颜色 */ ctrlStrokeStyle: string; /** 控制点填充颜色 */ ctrlFillStyle: string; /** 控制点半径 */ ctrlRadius: number; /** 是否隐藏标签 */ hideLabel: boolean; /** 标签背景填充颜色 */ labelFillStyle: string; /** 标签字体 */ /** 标签字型 */ labelFontFamily: string; /** 标签字号 */ labelFontSize: number; /** 标签文字颜色 */ textFillStyle: string; /** 标签字符最大长度,超出使用省略号 */ labelMaxLen: number; /** 画布宽度 */ WIDTH: number; /** 画布高度 */ HEIGHT: number; /** 背景图src */ imagesrc: string; imagealpha: number; canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D; /** 变化前的所有标注数据 */ olddataset: AllShape[]; /** 所有标注数据 */ dataset: AllShape[]; /** 撤销数组最多保存记录条数 */ MAX_LENGTH: number; doneList: AllShape[][]; undoList: AllShape[][]; /** 记录所有隐藏图形的uuid*/ hideList: string[]; offScreen: HTMLCanvasElement; offScreenCtx: CanvasRenderingContext2D; /** 记录锚点距离 */ remmber: number[][]; /** 记录鼠标位置 */ mouse: Point; /** 记录背景图鼠标位移 */ remmberOrigin: number[]; /** 0 不创建,1 矩形,2 多边形,3 点,4 折线,5 圆,6 网格, 7 刷子brush, 8 Mask,9 钢笔 */ createType: Shape; /** 控制点索引 */ ctrlIndex: number; /** 选中控制点索引 */ clickIndex: number; /** 背景图片 */ image: HTMLImageElement; /** 图片原始宽度 */ IMAGE_ORIGIN_WIDTH: number; /** 图片缩放宽度 */ IMAGE_WIDTH: number; /** 图片原始高度 */ IMAGE_ORIGIN_HEIGHT: number; /** 图片缩放高度 */ IMAGE_HEIGHT: number; /** 原点x */ originX: number; /** 原点y */ originY: number; /** 图片缩放步长 */ scaleStep: number; /** 标签名缩放步长 */ textscaleStep: number; /** 滚动缩放 */ scrollZoom: boolean; private timer; /** 最小touch双击时间 */ dblTouch: number; /** 记录touch双击开始时间 */ dblTouchStore: number; /** 这个选项可以帮助浏览器进行内部优化 */ alpha: boolean; /** 专注模式 */ focusMode: boolean; /** 记录当前事件 */ private evt; /** 触控缩放时记录上一次两点距离 */ scaleTouchStore: number; /** 当前是否为双指触控 */ isTouch2: boolean; isMobile: boolean; /** 向上展示label */ labelUp: boolean; private isCtrlKey; /** 自定义ctrl快捷键 KeyboardEvent.code */ ctrlCode: string; /** 网格右键菜单 */ gridMenuEnable: boolean; /** 网格选中背景填充颜色 */ gridSelectedFillStyle: string; /** 记录是否正在使用brush */ ispainting: boolean; /** brush线条样式 */ brushlineWidth: number; brushstrokeStyle: string; pencillineWidth: number; pencilstrokeStyle: string; mask_alpha: number; densityFactor: number; /** 记录正在生成轮廓的mask的canvasData */ activeCanvasData: ImageData | null; /** 记录正在生成的轮廓 */ activePolygon: string; isEraser: boolean; isErasing: boolean; eraserPoints: [number, number][]; /** 暂存未保存的brush轨迹点 */ tempBrushPoints: [number, number][]; eraserSize: number; random_color: { r: number; g: number; b: number; }[]; isMagicToolActive: boolean; magicPoints: MagicPoint[]; maxLinePointCount: number; /** * @param el Valid CSS selector string, or DOM * @param src image src */ constructor(el: HTMLCanvasElement | string, src?: string); /** 当前选中的标注 */ get activeShape(): any; /** 当前缩放比例 */ get scale(): number; /** 图片最小边尺寸 */ get imageMin(): number; /** 图片原始最大边尺寸 */ get imageOriginMax(): number; /** 合成事件 */ private mergeEvent; private handleLoad; private handleContextmenu; private handleMousewheel; private handleMouseDown; private handleMouseMove; private handleMouseUp; private handleDblclick; private handleKeydown; private handleKeyup; /** 初始化配置 */ initSetting(): void; /** 初始化事件 */ initEvents(): void; getscaledPoint(e: MouseEvent): Point; closePolygon: (poly: any[]) => any[][]; /** * 添加/切换图片 * @param url 图片链接 */ setImage(url: string, alpha?: number): void; handleMaskShape(item: AllShape, index: number): Promise<AllShape | null>; /** * 设置数据 * @param data Array * @param needCreate Boolean 是否需要创建(当传options时需要,当撤销重做操作传dataset时不需要) */ setData(data: AllShape[], needCreate?: boolean, toMask?: boolean, initSize?: boolean): Promise<void>; /** * 判断是否在标注实例上 * @param mousePoint 点击位置 * @returns */ hitOnShape(mousePoint: Point): [number, AllShape]; /** * 判断是否在标注实例顶点上 * @param mousePoint 点击位置 * @returns */ hitOnShapeVertex(): string; /** * 判断鼠标是否在背景图内部 * @param e MouseEvent * @returns 布尔值 */ isInBackground(e: MouseEvent | TouchEvent): boolean; /**point * 判断点是否在背景图内部 * @param point Point * @returns 布尔值 */ isPointInBackground(point: Point): boolean; /** * 判断是否在矩形内 * @param point 坐标 * @param coor 区域坐标 * @returns 布尔值 */ isPointInRect(point: Point, coor: Point[]): boolean; /** * 判断点是否在矩形的边上,并区分是在左右边还是上下边 * @param point 坐标 * @param coor 区域坐标 * @returns 字符串,表示对应的鼠标样式,或 'none' 表示不在边上 */ isPointOnRectEdge(point: Point, coor: Point[]): string; /** * 判断点是否在矩形的顶点上,并区分是在左上、左下、右上还是右下顶点 * @param point 坐标 * @param coor 区域坐标 * @returns 字符串,表示对应的鼠标样式,或 'none' 表示不在顶点上 */ isPointOnRectVertex(point: Point, coor: Point[]): string; /** * 判断是否在多边形内 * @param point 坐标 * @param coor 区域坐标 * @returns 布尔值 */ isPointInPolygon(point: Point, coor: Point[]): boolean; /** * 判断是否在多边形顶点上 * @param point 坐标 * @param coor 区域坐标 * @returns 布尔值 */ isPointOnPolygonVertex(point: Point, coor: Point[]): boolean; /** * 判断是否在圆内 * @param point 坐标 * @param center 圆心 * @param r 半径 * @param needScale 是否为圆形点击检测 * @returns 布尔值 */ isPointInCircle(point: Point, center: Point, r: number): boolean; /** * 判断是否在圆的顶点上 * @param point 坐标 * @param center 圆心 * @param r 半径 * @returns 布尔值 */ isPointOnCircleVertex(point: Point, center: Point, r: number): boolean; /** * 判断是否在折线内 * @param point 坐标 * @param coor 区域坐标 * @returns 布尔值 */ isPointInLine(point: Point, coor: Point[]): boolean; /** * 判断是否在折线内 * @param mousePoint 鼠标坐标 * @param pixels 像素点索引列表 * @returns 布尔值 */ isMouseInPixelsRegion(mousePoint: Point, canvasData: ImageData): boolean; getBoundingBoxOfColoredRegion(canvasData: ImageData): Point[]; getContourPointsOfColoredRegion(canvasData: ImageData, densityFactor?: number): Point[]; isBorderPoint(x: number, y: number, width: number, height: number, data: Uint8ClampedArray): boolean; samplePointsByDensity(points: Point[], densityFactor: number): Point[]; calculateCentroid(points: Point[]): Point; calculatePolarAngle(center: Point, point: Point): number; sortByPolarAngle(points: Point[]): Point[]; /** * 判断是图形是否属于嵌套关系 (目前只支持矩形和多边形) * @param shape1 标注实例 * @param shape2 标注实例 * @returns 布尔值 */ isNested(shape1: Rect | Polygon, shape2: Rect | Polygon): boolean; /** * 绘制矩形 * @param shape 标注实例 * @returns */ drawRect(shape: Rect, sub?: Record<string, any>): void; /** * 绘制多边形 * @param shape 标注实例 */ drawPolygon(shape: Polygon): void; /** * 绘制点 * @param shape 标注实例 */ drawDot(shape: Dot): void; /** * 绘制圆 * @param shape 标注实例 */ drawCirle(shape: Circle): void; /** * 绘制折线 * @param shape 标注实例 */ drawLine(shape: Line): void; hexToRGBA(hex: string, alpha?: number): string; rgbaToHex(rgba: string, includeAlpha?: boolean): string; isRGBA(color: string): boolean; removeDuplicatePoints(points: [number, number][], getBunding?: boolean, removePoints?: boolean): { resultRect: any[]; resultCoor?: undefined; } | { resultCoor: [number, number][]; resultRect: number[]; } | { resultCoor: [number, number][]; resultRect?: undefined; }; relEncodeBinary(x: number, y: number, width: number, height: number): number[]; relDecodeBinary(encoded: number[], nonWhiteColor?: string): Uint8ClampedArray; mergeToBrushMask(): BrushMask; /** * 绘制轨迹 * @param shape 轨迹实例 */ drawBrush(shape: Brush): void; drawBrushMask(shape: BrushMask): void; /** * 绘制网格 * @param shape 标注实例 * @returns */ drawGrid(shape: Grid): void; /** * 绘制控制点 * @param point 坐标 */ drawCtrl(point: Point): void; /** * 绘制控制点列表 * @param shape 标注实例 */ drawCtrlList(shape: Rect | Polygon | Line): void; calculateCenter(points: [number, number][]): [number, number]; getImagedataFromImageClass: (image: HTMLImageElement, masktype: string) => Uint8ClampedArray | null; putDataOnCanvas(thisCanvas: HTMLCanvasElement, pixels: number[], fillStyle: string, putImageData?: boolean): ImageData; drawPromptPointOnClick: (thisPrompt: MagicPoint, canvas: HTMLCanvasElement) => void; /** * 高亮Mask * @param index Mask的索引 * @param highlight 是否高亮 * @returns */ highlightMask(index: number): void; changeMaskPolygon(densityFactor: number): void; endMagicTool(): void; /** * 绘制Mask * @param shape 标注实例 * @returns */ drawMask(shape: Mask): void; addPoint(): void; deletePoint(): void; /** * 绘制路径线段 * @param shape 标注实例 * @returns */ drawPencil(shape: Pencil): void; /** * 绘制label * @param point 位置 * @param label 文本 */ drawLabel(point: Point, shape: AllShape, location?: String): void; /** * 更新画布 */ update(toMask?: boolean, initSize?: boolean): void; /** * 隐藏选中的图形 */ hideActiveShape(uuid: string): void; /** * 显示隐藏的图形 */ showHiddenShape(): void; /** * 删除指定矩形 * @param index number */ deleteByIndex(index: number): void; /** * 修改选中图像的标注信息 * @param tagId string * @param label string * @param color string */ updateLabelByIndex(index: number[], tagId: string, label: string, color: string, properties: string[]): void; /** * 删除画布中创建的所有图形 * @param index number */ deleteAllShape(): void; /** * 复制指定矩形 水平为x,竖直为y * @param index number */ copyByIndex(index: number): void; /** * 计算缩放步长 */ calcStep(flag?: string): void; /** * 缩放 * @param type true放大5%,false缩小5% * @param center 缩放中心 center|mouse * @param pure 不绘制 */ setScale(type: boolean, byMouse?: boolean, pure?: boolean): void; /** * 适配背景图 */ fitZoom(): void; /** * 恢复为原始图片尺寸 */ initZoom(): void; /** * 设置专注模式 * @param type {boolean} */ setFocusMode(type: boolean): void; manageDoneList(dataset: AllShape[]): void; /** * 撤销操作(目前不支持撤销隐藏、显示、专注等模式和状态切换) * 若支持,需要设置一个操作数组,每次往doneList中push时,记录下操作类型。撤销时,执行相应的逆方法 */ undo(): void; /** * 重做操作 */ redo(): void; /** * 销毁 */ destroy(): void; /** * 重新设置画布大小 */ resize(width: number, height: number, alpha?: number, imageurl?: string): void; } export {};