fabric-warpvas
Version:
This JavaScript library helps you efficiently build image warping tools on Fabric.js
387 lines (223 loc) • 7.1 kB
Markdown
[**fabric-warpvas**](../../README.md)
***
# Class: Warp
扭曲变形模式类
提供图像的扭曲变形功能。
交互说明:
1. 拖动交互点实现扭曲点的变换,支持框选
2. 点击内部区域,会出现临时交互点
3. 拖动临时交互点实现整体移动
4. 点击临时交互点实现变形区域分割
5. 选中交互点后点击Delete实现扭曲点的删除(PS:四个原始对角交互点无法被删除)
6. 按住设置按键限制控制点拖动只向水平或垂直方向移动(当 enableConstraintKey 设置为具体按键时生效)
## Example
```typescript
import { fabric } from 'fabric';
import { FabricWarpvas } from 'fabric-warpvas';
import Warp from 'fabric-warpvas/modes/warp';
// 创建 fabricWarpvas 实例
const canvas = new fabric.Canvas('canvas');
const fabricWarpvas = new FabricWarpvas(canvas);
// 创建扭曲模式
const warp = new Warp({ themeColor: '#FF0000' }); // 交互元素使用红色主题色
// 自定义模式中的控制点样式
warp.registerStyleSetter('control', (control) => {
control.set({
radius: 10,
fill: 'blue',
stroke: 'white'
});
return control;
});
// 进入变形态
fabricWarpvas.enterEditing(image, null, warp);
```
## Remarks
原始对象默认保持可见,需要手动隐藏
## See
- BaseMode 变形模式基类
- [FabricWarpvas](../../index/classes/FabricWarpvas.md) 主要功能类
## Extends
- `BaseMode`\<`WarpObjects`, `WarpOptions`\>
## Constructors
### new Warp()
> **new Warp**(`options`): [`Warp`](Warp.md)
创建扭曲变形模式实例
初始化一个新的扭曲变形模式。
#### Parameters
##### options
`Partial`\<`WarpOptions`\> = `{}`
#### Returns
[`Warp`](Warp.md)
#### Overrides
`BaseMode<WarpObjects, WarpOptions>.constructor`
## Properties
### name
> **name**: `string` = `"warp"`
变形模式的唯一标识名称
#### Overrides
`BaseMode.name`
***
### options
> **options**: `Required`\<`WarpOptions`\>
模式配置
#### Overrides
`BaseMode.options`
## 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**(`fabricWarpvas`): `undefined` \| () => `void`
在脏渲染后执行的钩子,用于渲染变形的交互元素
#### Parameters
##### fabricWarpvas
[`FabricWarpvas`](../../index/classes/FabricWarpvas.md)
FabricWarpvas 实例,提供操作接口
#### Returns
`undefined` \| () => `void`
清理函数,用于移除所有控制元素和事件监听
#### Example
```typescript
// 进入交互会自动调用
const cleanup = warp.dirtyRender(fabricWarpvas);
// 退出交互时清理
cleanup();
```
#### Overrides
`BaseMode.dirtyRender`
***
### execute()
> **execute**(`warpvas`): `Coord`[][][]
执行扭曲变形计算
代理方法,调用静态方法 [Warp.execute](Warp.md#execute-2) 进行实际的扭曲变形计算。
#### Parameters
##### warpvas
`Warpvas`
需要进行扭曲变形的贴图对象
#### Returns
`Coord`[][][]
返回计算后的网格分割点坐标数组
#### See
[Warp.execute](Warp.md#execute-2) 具体实现细节
#### Overrides
`BaseMode.execute`
***
### registerStyleSetter()
> **registerStyleSetter**\<`K`\>(`label`, `setter`): `void`
注册样式设置器,自定义变形模式中各种元素的外观,如果模式类并未对外提供设置入口,那便意味无法实现自定义修改
#### Type Parameters
• **K** *extends* keyof `WarpObjects`
样式设置器的标签类型,必须是 T 中定义的键之一
#### Parameters
##### label
`K`
样式设置器的标签,用于标识要设置的元素
##### setter
`WarpObjects`\[`K`\]
样式设置器的回调函数,用于设置元素的样式
#### Returns
`void`
#### Example
```typescript
// 进入变形模式的图像样式设置 80% 不透明度
mode.registerStyleSetter('image', (image) => {
image.set({ opacity: 0.8 });
});
```
#### Remarks
1. 新的样式设置会与现有设置合并,而不是完全替换
2. 对于同名设置器,新的会覆盖旧的
3. 样式会在下一次渲染时生效
#### Inherited from
`BaseMode.registerStyleSetter`
***
### render()
> **render**(`fabricWarpvas`): `undefined` \| () => `void`
渲染变形效果到画布
将变形后的贴图和网格边界线渲染到 Fabric.js 画布上。
#### Parameters
##### fabricWarpvas
[`FabricWarpvas`](../../index/classes/FabricWarpvas.md)
Fabric 变形工具实例,包含画布和变形状态
#### Returns
`undefined` \| () => `void`
清理函数,用于移除渲染的元素
#### Example
```typescript
class CustomMode extends BaseMode {
render(fabricWarpvas: FabricWarpvas) {
// 调用基类渲染方法
const cleanup = super.render(fabricWarpvas);
// 添加自定义渲染逻辑
const customElements = this.renderCustomElements();
// 返回组合的清理函数
return () => {
cleanup();
this.cleanupCustomElements(customElements);
};
}
}
```
#### Remarks
1. 返回的清理函数会在下次渲染前或离开编辑模式时自动调用
2. 子类可以通过 super.render() 复用基类的渲染逻辑
3. 渲染的元素样式可通过 registerStyleSetters 配置
#### Inherited from
`BaseMode.render`
***
### execute()
> `static` **execute**(`warpvas`): `Coord`[][][]
计算贴图的分割点坐标
根据贴图的网格曲线计算分割点的位置坐标。该方法会:
1. 遍历所有网格单元
2. 计算横向和纵向曲线的交点
3. 生成用于变形的控制点网格
#### Parameters
##### warpvas
`Warpvas`
需要进行变形的贴图对象
#### Returns
`Coord`[][][]
返回三维数组:
- 第一维:行索引
- 第二维:列索引
- 第三维:分割点坐标 {x, y}