bricks/aidocs/image.md
2025-10-05 06:39:58 +08:00

350 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `bricks.Image` 及相关图标组件技术文档
> 基于 `bricks.js` 框架的图像与图标类组件实现
---
## 概述
本模块定义了基于 `bricks.JsWidget` 的一系列图像与图标类组件,用于在网页中动态加载、显示和管理图像资源。主要包括:
- `bricks.Image`:基础图像组件
- `bricks.Icon`:可缩放的图标组件(继承自 `Image`
- `bricks.StatedIcon`:支持状态切换的图标组件(继承自 `Icon`
- `bricks.BlankIcon`:占位图标组件(无图像内容)
所有组件均通过 `bricks.Factory` 注册,可在配置系统中通过类型名实例化。
---
## 1. `bricks.Image`
### 类定义
```js
class extends bricks.JsWidget
```
### 构造函数
```js
constructor(opts)
```
#### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `opts` | Object | 配置选项对象 |
##### `opts` 属性
| 属性 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `url` | String | 否 | 图像的 URL 地址 |
| `default_url` | String | 否 | 当主 `url` 加载失败时使用的备用图像地址 |
#### 行为
- 调用父类构造函数。
- 若传入 `url`,则自动调用 `set_url()` 设置图像源。
---
### 方法
#### `create()`
创建一个 `<img>` 元素作为组件的 DOM 根节点。
```js
create()
```
> **说明**:该方法由框架调用,在初始化时创建 DOM 结构。
---
#### `set_url(url)`
设置图像的 `src` 属性,并绑定错误处理以支持默认图像。
```js
set_url(url)
```
##### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `url` | String | 图像资源 URL |
##### 行为
-`this.url` 设为传入值。
- 如果配置了 `default_url`,则为 `<img>` 绑定 `onerror` 事件处理器,加载失败时自动切换到默认图。
- 设置 `dom_element.src = url`
---
#### `set_default_url()`
当图像加载失败时触发,切换至默认图像。
```js
set_default_url()
```
##### 行为
- 移除 `onerror` 监听器,防止重复触发。
-`src` 设置为 `this.opts.default_url`
- 输出日志:`console.log('default_url', this.opts.default_url)`
---
#### `base64()`
将当前图像绘制到 Canvas 并导出为 Base64 编码的 PNG 数据 URL。
```js
base64()
```
##### 返回值
- `{String}` - 图像的 Data URL格式如`data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...`
##### 实现逻辑
1. 创建临时 `<canvas>` 元素。
2. 获取上下文并设置画布尺寸等于图像实际宽高。
3. 使用 `drawImage()` 将图像绘制到画布。
4. 调用 `toDataURL('image/png')` 生成 Base64 字符串。
5. 返回结果(未去除头部前缀)。
> ⚠️ 注意:此方法依赖图像已完全加载,否则可能绘制空白或异常内容。
---
#### `removeBase64Header(base64String)`
移除 Base64 字符串中的 MIME 头部信息(例如 `data:image/png;base64,`)。
```js
removeBase64Header(base64String)
```
##### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `base64String` | String | 完整的 Data URL 字符串 |
##### 返回值
- `{String}` - 纯 Base64 编码内容
##### 示例
```js
const clean = removeBase64Header('data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==');
// → 'R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='
```
---
## 2. `bricks.Icon`
### 类定义
```js
class extends bricks.Image
```
扩展 `Image` 类,提供基于字符单位(`charsize`)的响应式尺寸控制。
---
### 构造函数
```js
constructor(opts)
```
#### 参数
`bricks.Image`,额外支持以下选项:
##### `opts` 扩展属性
| 属性 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `rate` | Number | `1` | 缩放倍率,相对于 `charsize` |
| `cwidth` | Number | `1` | 占据的字符宽度数 |
| `cheight` | Number | `1` | 占据的字符高度数 |
| `dynsize` | Boolean | `true` | 是否启用动态尺寸调整 |
#### 行为
- 调用父类构造函数。
- 自动执行 `options_parse()` 进行配置解析与尺寸设置。
---
### 方法
#### `options_parse()`
解析配置项并设置图标尺寸及图像源。
```js
options_parse()
```
##### 动作
1. 设置 `rate`(默认为 1
2. 计算样式尺寸:`siz = bricks.app.charsize * rate + 'px'`
3. 调用 `set_url(this.url)` 重新加载图像(确保尺寸生效后加载)
4. 设置 `cwidth`, `cheight`, `dynsize`
5. 调用 `charsize_sizing()` 应用尺寸策略
> ✅ 提示:`charsize_sizing()` 是 `JsWidget` 提供的方法,用于根据字符网格进行布局适配。
---
## 3. `bricks.StatedIcon`
### 类定义
```js
class extends bricks.Icon
```
支持多状态切换的图标组件,常用于表示不同 UI 状态(如开/关、在线/离线等)。
---
### 构造函数
```js
constructor(opts)
```
#### 参数
| 属性 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `states` | Array<{state: String, url: String}> | 是 | 状态列表,每个状态包含名称和对应图像 URL |
| `state` | String | 否 | 初始状态名;若未指定,则使用第一个状态 |
#### 示例配置
```js
{
states: [
{ state: 'online', url: '/img/online.png' },
{ state: 'offline', url: '/img/offline.png' }
],
state: 'online'
}
```
#### 行为
- 调用父类构造函数。
- 自动执行 `options_parse()` 初始化状态。
---
### 方法
#### `options_parse()`
初始化状态机逻辑。
```js
options_parse()
```
##### 行为
- 若未定义 `states` 数组,则直接返回。
- 若未设置初始 `state`,则设为 `states[0].state`
- 调用 `set_state(this.state)` 激活初始状态
---
#### `set_state(state)`
切换当前图标状态,并更新图像。
```js
set_state(state)
```
##### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `state` | String | 要切换到的状态名称 |
##### 行为
- 更新 `this.state`
- 遍历 `this.states` 查找匹配项
- 找到后设置 `this.url = s.url`
- 调用 `super.options_parse()` 重新应用图像和尺寸
> 💡 支持链式调用与运行时状态变更。
---
## 4. `bricks.BlankIcon`
### 类定义
```js
class extends bricks.JsWidget
```
一个不渲染图像的“空白图标”,仅保留图标布局结构,用作占位符。
---
### 构造函数
```js
constructor(opts)
```
#### 参数
`Icon`,支持:
- `rate`: 缩放比例
- `cwidth`, `cheight`: 字符单元占用
- `dynsize`: 是否动态调整大小
#### 行为
- 不创建图像元素。
- 仅调用 `charsize_sizing()` 实现布局占位。
---
## 工厂注册
所有组件均已注册至 `bricks.Factory`,可在模板或配置中通过字符串类型名实例化:
```js
bricks.Factory.register('Image', bricks.Image);
bricks.Factory.register('StatedIcon', bricks.StatedIcon);
bricks.Factory.register('Icon', bricks.Icon);
bricks.Factory.register('BlankIcon', bricks.BlankIcon);
```
### 使用示例(假设模板语法)
```json
{
"type": "Icon",
"url": "/icons/save.png",
"rate": 1.5,
"cwidth": 2,
"cheight": 2
}
```
---
## 总结
| 组件 | 用途 | 特性 |
|------|------|------|
| `Image` | 显示普通图像 | 支持错误 fallback、Base64 导出 |
| `Icon` | 可缩放图标 | 基于 `charsize` 自适应尺寸 |
| `StatedIcon` | 多状态图标 | 支持运行时状态切换 |
| `BlankIcon` | 布局占位符 | 无图像,仅占空间 |
---
## 注意事项
1. **图像跨域问题**:使用 `base64()` 方法时,若图像来自跨域服务器且未开启 CORSCanvas 将被污染导致无法导出数据。
2. **异步加载**`base64()` 应在图像 `load` 事件完成后调用,否则结果不可靠。
3. **内存泄漏风险**:频繁调用 `base64()` 会创建大量临时 Canvas建议缓存或节流。
4. **默认图像防循环**:确保 `default_url` 图像本身有效,避免 `onerror` 死循环。
---
## 版本信息
- 框架:`bricks.js`
- 模块:`image.js`
- 最后更新2025年4月5日
---
**建议使用场景**
- 图标按钮、状态指示器、用户头像、动态图像预览等需要灵活控制图像行为的 UI 元素。