UNPKG

fabric-texture

Version:

This JavaScript library enables fast and efficient image distortion transformations using Canvas 2D.

582 lines (349 loc) 11.6 kB
[**fabric-texture**](../../README.md) *** # Class: Warp 扭曲变形模式类 提供图像的扭曲变形功能,通过以下方式实现自由扭曲效果: 核心功能: - 顶点控制:四个角点可自由拖拽 - 曲线控制:边缘曲线可通过中间控制点调整 - 网格分割:支持在任意位置添加新的控制点 - 实时预览:所有操作都能即时查看效果 - 样式定制:支持自定义控件元素样式 交互方式: 1. 顶点拖拽:移动四个角点改变整体形状 2. 曲线调整:选中顶点后显示曲线控制点,拖拽改变曲线形状 3. 网格分割: - 点击图像内部显示分割点 - 点击分割点在该位置添加新控制点 - 选中控制点按Delete键删除 4. 整体移动:拖拽分割点可整体移动图像 ## Example ```typescript // 1. 基础用法 const canvas = new fabric.Canvas('canvas'); const fabricTexture = new FabricTexture(canvas); // 创建扭曲模式并应用到图像 const warp = new Warp('#FF0000'); // 使用红色主题 fabricTexture.enterEditing(image, null, warp); // 2. 自定义拖拽图标样式 const warp = new Warp() .setStyleSetters({ control: (point) => { point.set({ radius: 10 }); return point; }, }); // 3. 隐藏原始对象(可选) image.set({ visible: false }); canvas.renderAll(); ``` ## Remarks 原始对象默认保持可见,需要手动隐藏 ## See - BaseMode 变形模式基类 - [FabricTexture](../../index/classes/FabricTexture.md) 主要功能类 ## Extends - `BaseMode`\<\{ `control`: (`object`) => `fabric.Object`; `curveControl`: (`object`) => `fabric.Object`; `insertControl`: (`object`) => `fabric.Object`; `line`: (`line`) => `void`; \}\> ## Constructors ### new Warp() > **new Warp**(`themeColor`, `subThemeColor`, `options`): [`Warp`](Warp.md) 创建扭曲变形模式实例 初始化一个新的扭曲变形模式,设置主题色和交互色。 #### Parameters ##### themeColor `string` = `THEME_COLOR` 主题色,用于控制点的默认颜色,默认为 THEME_COLOR ##### subThemeColor `string` = `SUB_THEME_COLOR` 交互色,用于控制点被选中时的颜色,默认为 SUB_THEME_COLOR ##### options `WarpOptions` = `{}` #### Returns [`Warp`](Warp.md) #### Overrides `BaseMode<{ /** * 可配置顶点控制点的方法 * @param object - 默认的控制点对象 * @returns 作为顶点控制点对象的fabric元素对象,可使用默认对象以外的新对象 */ control: (object: fabric.Object) => fabric.Object; /** * 可配置扭曲控制点的方法 * @param object - 默认的控制点对象 * @returns 作为扭曲控制点对象的fabric元素对象,可使用默认对象以外的新对象 */ curveControl: (object: fabric.Object) => fabric.Object; /** * 可配置插入控制点的方法 * @param object - 默认的控制点对象 * @returns 作为插入控制点对象的fabric元素对象,可使用默认对象以外的新对象 */ insertControl: (object: fabric.Object) => fabric.Object; /** * 可配置顶点控制点与扭曲控制点之间连线样式的方法 * @param line - 连线对象 */ line: (line: fabric.Line) => void; }>.constructor` ## Properties ### name > **name**: `string` = `'Warp'` 变形模式的唯一标识名称 #### Overrides `BaseMode.name` *** ### options > **options**: `Required`\<`WarpOptions`\> 模式配置 *** ### subThemeColor > **subThemeColor**: `string` = `SUB_THEME_COLOR` 副主题色 决定交互控件交互时的变化色,应与主题色形成合适的搭配 #### Default ```ts SUB_THEME_COLOR ('#324346') ``` #### See SUB_THEME_COLOR 默认副主题色常量 #### Inherited from `BaseMode.subThemeColor` *** ### themeColor > **themeColor**: `string` = `THEME_COLOR` 主题色 决定交互控件的颜色 #### Default ```ts THEME_COLOR ('#44A08D') ``` #### See THEME_COLOR 默认主题色常量 #### Inherited from `BaseMode.themeColor` ## Accessors ### controlObjects #### Get Signature > **get** **controlObjects**(): `Object`[] 获取所有顶点控制点 返回所有用于控制贴图顶点的主控制点对象列表。 这些控制点位于贴图的四个角和边缘分割点位置。 ##### Returns `Object`[] 顶点控制点对象数组 *** ### insertControlObject #### Get Signature > **get** **insertControlObject**(): `null` \| `Object` 获取当前激活的插入控制点 返回当前正在交互的插入点对象。 当用户点击贴图内部时会创建此控制点, 用户可以通过点击它来在该位置添加新的分割点。 ##### Returns `null` \| `Object` 插入控制点对象,如果不存在则返回 null *** ### lineObjects #### Get Signature > **get** **lineObjects**(): `Line`[] 获取所有控制点连接线 返回所有连接主控制点和曲线控制点的线段对象列表。 这些线段用于可视化控制点之间的关系。 ##### Returns `Line`[] 连接线对象数组 *** ### subControlObjects #### Get Signature > **get** **subControlObjects**(): `Object`[] 获取所有曲线控制点 返回所有用于调整曲线形状的次要控制点对象列表。 这些控制点位于边缘曲线的中间位置,用于调整曲线的弯曲程度。 ##### Returns `Object`[] 曲线控制点对象数组 ## Methods ### dirtyRender() > **dirtyRender**(`fabricTexture`): `undefined` \| () => `void` 渲染变形控制界面 在画布上创建和管理所有交互控制元素,包括: 1. 控制点系统 - 主控制点:用于控制顶点位置 - 曲线控制点:用于调整曲线形状 - 连接线:显示控制点之间的关系 2. 交互行为 - 拖拽控制点:调整形状 - 选中/取消选中:显示/隐藏相关控制点 - 点击内部:添加新的分割点 - 按Delete键:删除选中的控制点 3. 视觉反馈 - 控制点层级:主控制点 > 曲线控制点 > 连接线 - 选中状态:使用副主题色标识 - 实时预览:所有操作即时生效 #### Parameters ##### fabricTexture [`FabricTexture`](../../index/classes/FabricTexture.md) FabricTexture 实例对象 #### Returns `undefined` \| () => `void` 清理函数,用于移除所有控制元素和事件监听 #### Example ```typescript // 进入编辑模式时会自动调用 const cleanup = warp.dirtyRender(fabricTexture); // 退出编辑模式时清理 cleanup(); ``` #### Overrides `BaseMode.dirtyRender` *** ### execute() > **execute**(`texture`): `Coord`[][][] 执行扭曲变形计算 代理方法,调用静态方法 [Warp.execute](Warp.md#execute-2) 进行实际的扭曲变形计算。 #### Parameters ##### texture [`Texture`](../../index/classes/Texture.md) 需要进行扭曲变形的贴图对象 #### Returns `Coord`[][][] 返回计算后的网格分割点坐标数组 #### See [Warp.execute](Warp.md#execute-2) 具体实现细节 #### Overrides `BaseMode.execute` *** ### render() > **render**(`fabricTexture`): `undefined` \| () => `void` 渲染变形效果到画布 将变形后的贴图和网格边界线渲染到 Fabric.js 画布上。 #### Parameters ##### fabricTexture [`FabricTexture`](../../index/classes/FabricTexture.md) Fabric 变形工具实例,包含画布和变形状态 #### Returns `undefined` \| () => `void` 清理函数,用于移除渲染的元素 #### Example ```typescript class CustomMode extends BaseMode { render(fabricTexture: FabricTexture) { // 调用基类渲染方法 const cleanup = super.render(fabricTexture); // 添加自定义渲染逻辑 const customElements = this.renderCustomElements(); // 返回组合的清理函数 return () => { cleanup(); this.cleanupCustomElements(customElements); }; } } ``` #### Remarks 1. 返回的清理函数会在下次渲染前或离开编辑模式时自动调用 2. 子类可以通过 super.render() 复用基类的渲染逻辑 3. 渲染的元素样式可通过 setStyleSetters 配置 #### Inherited from `BaseMode.render` *** ### setStyleSetters() > **setStyleSetters**(`styleSetters`): [`Warp`](Warp.md) 配置变形模式中各元素的样式 通过样式设置器自定义变形模式中各种元素的外观,支持: - 变形后的贴图样式 - 网格边界线样式 - 通过泛型扩展的自定义元素样式 #### Parameters ##### styleSetters `Partial`\<`BaseStyleSetters`\<`Record`\<`string`, (...`rgs`) => `Object`\>\>\> 样式设置器配置对象 #### Returns [`Warp`](Warp.md) 当前实例,支持链式调用 #### Example ```typescript mode.setStyleSetters({ texture: (image) => { image.set({ opacity: 0.8 }); } }); ``` #### Remarks 1. 新的样式设置会与现有设置合并,而不是完全替换 2. 对于同名设置器,新的会覆盖旧的 3. 样式会在下一次渲染时生效 #### Inherited from `BaseMode.setStyleSetters` *** ### createDefaultControl() > `static` **createDefaultControl**(`themeColor`): `Circle` 创建顶点控制点 创建用于拖拽变形的主要控制点,显示在贴图的四个角和边缘分割点位置。 控制点样式: - 形状:圆形 - 大小:7px 半径 - 颜色:主题色填充,白色描边 - 交互:可拖拽,无控制框和边框 #### Parameters ##### themeColor `string` 控制点的填充颜色 #### Returns `Circle` 返回 Fabric.js 圆形对象 #### Example ```typescript const control = Warp.createDefaultControl('#FF0000'); canvas.add(control); ``` *** ### createDefaultCurveControl() > `static` **createDefaultCurveControl**(): `Rect` 创建曲线控制点 创建用于调整曲线形状的次要控制点,显示在边缘曲线的中间位置。 控制点样式: - 形状:圆角矩形 - 大小:6x6 像素 - 颜色:白色填充,灰色描边 - 特性:默认隐藏,选中主控制点时显示 - 交互:可拖拽,无控制框和边框 #### Returns `Rect` 返回 Fabric.js 矩形对象 #### Example ```typescript const curveControl = Warp.createDefaultCurveControl(); canvas.add(curveControl); ``` *** ### createDefaultInsertControl() > `static` **createDefaultInsertControl**(`themeColor`): `Circle` 创建插入点控制点 创建用于标识可插入新控制点位置的指示器,点击后在该位置添加新的分割点。 控制点样式: - 形状:圆形 - 大小:5px 半径 - 颜色:半透明白色填充,主题色描边 - 特性:不可选中,仅用于视觉提示 - 交互:无法直接拖拽 #### Parameters ##### themeColor `string` 控制点的描边颜色 #### Returns `Circle` 返回 Fabric.js 圆形对象 #### Example ```typescript const insertPoint = Warp.createDefaultInsertControl('#FF0000'); canvas.add(insertPoint); ``` *** ### execute() > `static` **execute**(`texture`): `Coord`[][][] 计算贴图的分割点坐标 根据贴图的网格曲线计算分割点的位置坐标。该方法会: 1. 遍历所有网格单元 2. 计算横向和纵向曲线的交点 3. 生成用于变形的控制点网格 #### Parameters ##### texture [`Texture`](../../index/classes/Texture.md) 需要计算分割点的贴图对象 #### Returns `Coord`[][][] 返回三维数组: - 第一维:行索引 - 第二维:列索引 - 第三维:分割点坐标 {x, y} #### Example ```typescript const splitPoints = Warp.execute(texture); // splitPoints 结构示例: // [ // [ // 第一行 // [ // 第一列 // {x: 10, y: 20}, // 分割点1 // {x: 30, y: 40} // 分割点2 // ] // ] // ] ```