UNPKG

fabric-warpvas

Version:

This JavaScript library helps you efficiently build image warping tools on Fabric.js

210 lines (209 loc) 6.55 kB
import { FabricObject } from 'fabric/es'; import type { Warpvas } from 'warpvas'; import type { FabricWarpvas } from '../core/fabric-warpvas.class'; import BaseMode, { BaseOptions } from './base.class'; /** * 变形区域的顶点类型枚举 * * 用于标识变形区域四个角的位置。 * * @enum {string} */ export declare enum VertexType { /** 左上角顶点 */ TOP_LEFT = "tl", /** 右上角顶点 */ TOP_RIGHT = "tr", /** 左下角顶点 */ BOTTOM_LEFT = "bl", /** 右下角顶点 */ BOTTOM_RIGHT = "br" } /** * 透视模式配置 */ type PerspectiveOptions = BaseOptions<{ /** * 是否启用空白区域拖拽实现整体变形 * * @default true */ enableDragResize?: boolean; /** * 空白区域拖拽实现整体变形的最小拖拽区域大小,默认 50 像素 * * @default 50 */ minimumDragThreshold?: number; /** * 是否启用移动约束按键,默认禁用(None) * * 启用后: * - 移动控点时按键限制移动方向为水平或垂直 * - 移动方向取决于拖拽距离较大的方向 * * @default 'None' 表示禁用移动约束 */ enableConstraintKey?: string | 'none'; }>; /** * 透视变形模式 * * 提供图像的透视变形功能,通过四个对角控制点实现自由透视效果。 * * 交互说明: * 1. 拖动控制点实现透视的变换(PS:形成三角形后无法进一步透视变换) * 2. 空白区域持续拖拽形成整体变形(当 enableDragResize 为 true 时生效) * 3. 按住设置按键限制控制点拖动只向水平或垂直方向移动(当 enableConstraintKey 设置为具体按键时生效) * * @example * ```typescript * import { fabric } from 'fabric'; * import { FabricWarpvas } from 'fabric-warpvas'; * import Perspective from 'fabric-warpvas/modes/perspective'; * * // 创建 fabricWarpvas 实例 * const canvas = new fabric.Canvas('canvas'); * const fabricWarpvas = new FabricWarpvas(canvas); * * // 创建透视模式 * const perspective = new Perspective({ themeColor: '#FF0000' }); // 交互元素使用红色主题色 * * // 自定义模式中的控制点样式 * perspective.registerStyleSetter('control', (control) => { * control.set({ * radius: 10, * fill: 'blue', * stroke: 'white' * }); * return control; * }); * * // 进入变形态 * fabricWarpvas.enterEditing(image, null, perspective); * ``` * * @remarks * 使用注意:四个对角控制点形成三角形后无法进一步拖拽,这会导致无效的透视效果 */ declare class Perspective extends BaseMode<{ /** * 配置对角控制点样式回调 * @param object - 默认的控制点对象 * @returns 作为控制点对象的fabric元素对象,可使用默认对象以外的新对象 */ control: (object: FabricObject) => FabricObject; }, PerspectiveOptions> { /** * 变形模式的唯一标识名称 */ name: string; /** * 模式配置 */ options: Required<PerspectiveOptions>; /** * 控制点映射表 * * 存储控制点与其相关数据的映射关系,包括: * - curve: 控制点所在的贝塞尔曲线 * - targetPointIdx: 控制点在曲线上的索引位置 * - rowIndex: 控制点所在的网格行索引 * - colIndex: 控制点所在的网格列索引 * - vertexType: 控制点的顶点类型(如左上、右上等) * * @internal 仅供内部使用 */ private _objectControlMap; /** * 创建透视变形模式实例 * * 初始化一个透视变形模式。 */ constructor(options?: Partial<PerspectiveOptions>); /** * 计算透视变形的网格分割点 * * 该方法实现了透视变形的核心算法,依赖于 warpvas-perspective 库。 * * @param warpvas - 需要进行透视变形的贴图对象 * @returns 返回三维数组,表示网格的分割点坐标: * - 第一维:行索引 * - 第二维:列索引 * - 第三维:点的坐标 {x, y} * * @throws {Error} 当四个顶点形成无效的透视形状时抛出错误 * * @remarks * 1. 顶点的移动范围会受到透视有效性的限制 * 2. 当线条平行时会使用默认点代替交点 */ static execute(warpvas: Warpvas): { x: number; y: number; }[][][]; /** * 获取当前所有的控制点对象 * * 返回当前透视变形模式中的所有控制点对象。 * * @returns {FabricObject[]} 返回所有控制点对象的数组 * * @example * ```typescript * // 1.隐藏所有控制点 * perspective.controlObjects.forEach(control => { * control.set({ visible: false }); * }); * canvas.renderAll(); * * // 2.将所有控制点移到最上层 * perspective.controlObjects.forEach(control => { * canvas.bringObjectToFront(control); * }); * ``` */ get controlObjects(): FabricObject[]; /** * 执行透视变形计算 * * 代理方法,调用静态方法 {@link Perspective.execute} 进行实际的透视变形计算。 * * @param warpvas - 需要进行透视变形的贴图对象 * @returns 返回计算后的网格分割点坐标数组 * * @see {@link Perspective.execute} 具体实现细节 */ execute(warpvas: Warpvas): { x: number; y: number; }[][][]; /** * 在脏渲染后执行的钩子,用于渲染透视变形的交互元素 * * @param fabricWarpvas - FabricWarpvas 实例,提供操作接口 * @returns 返回清理函数,用于移除所有控制点和事件监听器 * * @example * ```typescript * // 进入交互会自动调用 * const cleanup = perspective.dirtyRender(fabricWarpvas); * * // 退出交互时清理 * cleanup(); * ``` * * @remarks * 无效的透视变形会自动回退到上一个有效状态 */ dirtyRender(fabricWarpvas: FabricWarpvas): (() => void) | undefined; /** * 创建透视模式默认的顶点控制点对象 * * 创建一个圆形的控制点,用于作为顶点控制点提供拖拽变形的功能。 * * @returns {fabric.Circle} 返回一个 fabric.Circle 实例作为控制点 */ private _createDefaultControl; } export default Perspective;