canvas-select
Version:
一个用于图片标注的javascript库,基于canvas,简单轻量,支持矩形、多边形、点、折线、圆形、网格、画笔、橡皮擦
429 lines (428 loc) • 12.5 kB
TypeScript
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 Eraser from './shape/Eraser';
export type Point = [number, number];
export type AllShape = Rect | Polygon | Dot | Line | Circle | Grid | Brush | Eraser;
declare enum Shape {
None = 0,
Rect = 1,
Polygon = 2,
Dot = 3,
Line = 4,
Circle = 5,
Grid = 6,
Brush = 7,
Eraser = 8
}
export default class CanvasSelect extends EventBus {
/** 当前版本 */
version: string;
/** 只读模式,画布不允许任何交互 */
lock: boolean;
/** 只读模式,仅支持查看 */
readonly: boolean;
/** 最小矩形宽度 */
MIN_WIDTH: number;
/** 最小矩形高度 */
MIN_HEIGHT: number;
/** 最小圆形半径 */
MIN_RADIUS: number;
/** 边线颜色 */
strokeStyle: string;
/** 填充颜色 */
fillStyle: string;
/** 边线宽度 */
lineWidth: number;
/** 当前选中的标注边线颜色 */
activeStrokeStyle: string;
/** 当前选中的标注填充颜色 */
activeFillStyle: string;
/** 控制点边线颜色 */
ctrlStrokeStyle: string;
/** 控制点填充颜色 */
ctrlFillStyle: string;
/** 控制点半径 */
ctrlRadius: number;
/** 是否隐藏标签 */
hideLabel: boolean;
/** 标签背景填充颜色 */
labelFillStyle: string;
/** 标签字体 */
labelFont: string;
/** 标签文字颜色 */
textFillStyle: string;
/** 标签字符最大长度,超出使用省略号 */
labelMaxLen: number;
/** 画布宽度 */
WIDTH: number;
/** 画布高度 */
HEIGHT: number;
/** XY十字坐标 */
crossX: Line;
crossY: Line;
crossStroke: string;
/** 开启十字辅助 */
showCross: boolean;
/** 开启矩形旋转控制点 */
showRotation: boolean;
canvas: HTMLCanvasElement | undefined;
ctx: CanvasRenderingContext2D | null | undefined;
/** 所有标注数据 */
dataset: AllShape[];
offScreen: HTMLCanvasElement | undefined;
offScreenCtx: CanvasRenderingContext2D | null | undefined;
magnifierCanvas: HTMLCanvasElement | undefined;
magnifierCtx: CanvasRenderingContext2D | undefined;
isMagnifierVisible: boolean;
magnifierPosition: Point | 'auto';
/** 记录锚点距离 */
remmber: number[][];
/** 记录鼠标位置 */
mouse: Point;
/** 记录背景图鼠标位移 */
remmberOrigin: number[];
/** 0 不创建,1 矩形,2 多边形,3 点,4 折线,5 圆,6 网格 */
createType: Shape;
/** 控制点索引 */
ctrlIndex: 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;
/** 滚动缩放 */
scrollZoom: boolean;
private timer;
/** 最小touch双击时间 */
dblTouch: number;
/** 记录touch双击开始时间 */
dblTouchStore: number;
/** 这个选项可以帮助浏览器进行内部优化 */
alpha: boolean;
/** 专注模式 */
focusMode: boolean;
/** 触控缩放时记录上一次两点距离 */
scaleTouchStore: number;
/** 当前是否为双指触控 */
isTouch2: boolean;
isMobile: boolean;
/** 向上展示label */
labelUp: boolean;
private isCtrlKey;
/** 自定义ctrl快捷键 KeyboardEvent.code */
ctrlCode: string;
/** 网格右键菜单 */
gridMenuEnable: boolean;
/** 网格选中背景填充颜色 */
gridSelectedFillStyle: string;
/** 画笔大小 */
brushSize: number;
/** 画笔颜色 */
brushStokeStyle: string;
/** 橡皮擦大小 */
eraserSize: number;
/** 标注坐标 (以背景图片左上角为原点) */
position: number[];
/**
* @param el Valid CSS selector string, or DOM
* @param src image src
*/
constructor(el: HTMLCanvasElement | string, src?: string | HTMLImageElement);
/** 当前当前选中的标注 */
get activeShape(): any;
/** 当前缩放比例 */
get scale(): number;
/** 图片最小边尺寸 */
get imageMin(): number;
/** 图片原始最大边尺寸 */
get imageOriginMax(): number;
/** 创建放大镜容器 */
createMagnifierCanvas(): void;
/** 创建放大镜 */
createMagnifier(x: number, y: number): void;
/** 更新放大镜 */
updateMagnifier(x: number, y: number): void;
/** 销毁放大镜 */
private destroyMagnifier;
getImageDataFromCanvas(canvas: HTMLCanvasElement, [x, y, width, height]: [number, number, number, number]): ImageData | undefined;
/** 合成事件 */
mergeEvent(e: TouchEvent | MouseEvent): {
mouseX: number;
mouseY: number;
mouseCX: number;
mouseCY: number;
altKey: boolean;
button: number;
buttons: number;
clientX: number;
clientY: number;
ctrlKey: boolean;
layerX: number;
layerY: number;
metaKey: boolean;
movementX: number;
movementY: number;
offsetX: number;
offsetY: number;
pageX: number;
pageY: number;
relatedTarget: EventTarget | null;
screenX: number;
screenY: number;
shiftKey: boolean;
x: number;
y: number;
getModifierState(keyArg: string): boolean;
initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null): void;
detail: number;
view: Window | null;
which: number;
initUIEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, detailArg?: number): void;
bubbles: boolean;
cancelBubble: boolean;
cancelable: boolean;
composed: boolean;
currentTarget: EventTarget | null;
defaultPrevented: boolean;
eventPhase: number;
isTrusted: boolean;
returnValue: boolean;
srcElement: EventTarget | null;
target: EventTarget | null;
timeStamp: DOMHighResTimeStamp;
type: string;
composedPath(): EventTarget[];
initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
preventDefault(): void;
stopImmediatePropagation(): void;
stopPropagation(): void;
NONE: 0;
CAPTURING_PHASE: 1;
AT_TARGET: 2;
BUBBLING_PHASE: 3;
} | {
mouseX: number;
mouseY: number;
mouseCX: number;
mouseCY: number;
altKey: boolean;
changedTouches: TouchList;
ctrlKey: boolean;
metaKey: boolean;
shiftKey: boolean;
targetTouches: TouchList;
touches: TouchList;
detail: number;
view: Window | null;
which: number;
initUIEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, detailArg?: number): void;
bubbles: boolean;
cancelBubble: boolean;
cancelable: boolean;
composed: boolean;
currentTarget: EventTarget | null;
defaultPrevented: boolean;
eventPhase: number;
isTrusted: boolean;
returnValue: boolean;
srcElement: EventTarget | null;
target: EventTarget | null;
timeStamp: DOMHighResTimeStamp;
type: string;
composedPath(): EventTarget[];
initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
preventDefault(): void;
stopImmediatePropagation(): void;
stopPropagation(): void;
NONE: 0;
CAPTURING_PHASE: 1;
AT_TARGET: 2;
BUBBLING_PHASE: 3;
};
private handleLoad;
private handleContextmenu;
private handleMousewheel;
private handleMouseDown;
private handleMouseMove;
private handleMouseUp;
private handleDblclick;
private handleKeydown;
private handleKeyup;
/** 初始化配置 */
initSetting(): void;
/** 初始化事件 */
initEvents(): void;
/**
* 添加/切换图片
* @param source 图片链接或图片对象
*/
setImage(source: string | HTMLImageElement): void;
/**
* 设置数据
* @param data Array
*/
setData(data: AllShape[]): void;
/**
* 判断是否在标注实例上
* @param mousePoint 点击位置
* @returns
*/
hitOnShape(mousePoint: Point): [number, AllShape];
/**
* 判断鼠标是否在背景图内部
* @param e MouseEvent
* @returns 布尔值
*/
isInBackground(e: MouseEvent | TouchEvent): boolean;
/**
* 判断是否在矩形内
* @param point 坐标
* @param coor 区域坐标
* @returns 布尔值
*/
isPointInRect(point: Point, coor: Point[]): boolean;
/**
* 判断是否在多边形内
* @param point 坐标
* @param coor 区域坐标
* @returns 布尔值
*/
isPointInPolygon(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 coor 区域坐标
* @returns 布尔值
*/
isPointInLine(point: Point, coor: Point[]): 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;
/**
* 绘制网格
* @param shape 标注实例
* @returns
*/
drawGrid(shape: Grid): void;
/**
* 绘制画笔路径
* @param shape 形状
*/
drawBrushPath(shape: Brush): void;
/**
* 绘制橡皮擦路径
* @param coor 折线坐标
* @param shape 形状
*/
drawEraserPath(shape: Eraser): void;
/** 清除画布 */
clearBrush(): void;
/**
* 绘制控制点
* @param point 坐标
*/
drawCtrl(point: Point, color?: string): void;
/**
* 绘制控制点列表
* @param shape 标注实例
*/
drawCtrlList(shape: Rect | Polygon | Line): void;
/**
* 绘制label
* @param point 位置
* @param label 文本
*/
drawLabel(point: Point, shape: AllShape): void;
/**
* 更新画布
*/
update(): void;
/**
* 通过索引删除指定形状
* @param index number
*/
deleteByIndex(index: number): void;
/**
* 通过uuid删除指定形状
* @param index string
*/
deleteByUuid(uuid: string): 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;
/**
* 设置专注模式
* @param type {boolean}
*/
setFocusMode(type: boolean): void;
/**
* 销毁
*/
destroy(): void;
/**
* 重新设置画布大小
*/
resize(): void;
}
export {};