1# ImageBitmap
2
3ImageBitmap对象可以存储canvas渲染的像素数据。
4
5>  **说明:**
6>
7>  从 API Version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9## 接口
10
11### ImageBitmap<sup>12+</sup>
12
13ImageBitmap(data: PixelMap, unit?: LengthMetricsUnit)
14
15通过PixelMap创建ImageBitmap对象。
16
17**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
18
19**系统能力:** SystemCapability.ArkUI.ArkUI.Full
20
21**参数:**
22
23| 参数名  | 类型   | 必填  | 说明                                    |
24| ---- | ------ | ---- | ---------------------------------------- |
25| data  | [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 是    | 图片的数据源支持PixelMap对象。 |
26| unit  | [LengthMetricsUnit](ts-canvasrenderingcontext2d.md#lengthmetricsunit12) | 否 |  用来配置ImageBitmap对象的单位模式,配置后无法动态更改,配置方法同[CanvasRenderingContext2D](ts-canvasrenderingcontext2d.md#lengthmetricsunit12)。<br>默认值:DEFAULT。 |
27
28### ImageBitmap
29
30ImageBitmap(src: string, unit?: LengthMetricsUnit)
31
32通过ImageSrc创建ImageBitmap对象。
33
34**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
35
36**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
37
38**系统能力:** SystemCapability.ArkUI.ArkUI.Full
39
40**参数:**
41
42| 参数名  | 类型   | 必填  | 说明                                    |
43| ---- | ------ | ---- | ---------------------------------------- |
44| src  | string | 是  | 图片的数据源支持本地图片。<br>1、string格式用于加载本地图片,例如ImageBitmap("common/images/example.jpg"),type为"entry"和"feature"类型的Module,其图片加载路径的起点为当前Module的ets文件夹,type为"har"和"shared"类型的Module,其图片加载路径的起点为当前构建的"entry"或"feature"类型Module的ets文件夹。<br/>type为"har"和"shared"类型的Module中推荐使用[ImageSource](../../../media/image/image-decoding.md)图片解码方式将资源图片解码为统一的PixelMap加载使用。<br/>2、支持本地图片类型:bmp、jpg、png、svg和webp类型。<br/>**说明:**<br/>- ArkTS卡片上不支持`http://`等网络相关路径前缀、`datashare://`路径前缀以及`file://data/storage`路径前缀的字符串。 |
45| unit<sup>12+</sup>  | [LengthMetricsUnit](../js-apis-arkui-graphics.md#lengthmetricsunit12) | 否 | 用来配置ImageBitmap对象的单位模式,配置后无法动态更改,配置方法同[CanvasRenderingContext2D](ts-canvasrenderingcontext2d.md#lengthmetricsunit12)。<br>默认值:DEFAULT。 |
46
47
48## 属性
49
50**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
51
52**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
53
54**系统能力:** SystemCapability.ArkUI.ArkUI.Full
55
56| 名称     | 类型 | 只读 | 可选 | 描述 |
57| ------ | ------ | ----- | -------- | --------------------------- |
58| width | number | 是 | 否 | ImageBitmap的像素宽度。<br>默认单位为vp。 |
59| height | number | 是 | 否 | ImageBitmap的像素高度。<br>默认单位为vp。 |
60
61## close
62
63close(): void
64
65释放ImageBitmap对象相关联的所有图形资源,并将ImageBitmap对象的宽高置为0。close示例代码同创建ImageBitmap代码。
66
67**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
68
69**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
70
71**系统能力:** SystemCapability.ArkUI.ArkUI.Full
72
73## ImageBitmap支持并发线程绘制
74
75从API version 11开始,当应用创建[Worker线程](../../../arkts-utils/worker-introduction.md),支持使用postMessage将ImageBitmap实例传到Worker中进行绘制,并使用onmessage接收Worker线程发送的绘制结果进行显示。
76
77## 示例
78
79### 示例1(加载图片)
80
81通过ImageBitMap加载本地图片。
82
83  ```ts
84  // xxx.ets
85  @Entry
86  @Component
87  struct ImageExample {
88    private settings: RenderingContextSettings = new RenderingContextSettings(true)
89    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
90    private img:ImageBitmap = new ImageBitmap("common/images/example.jpg")
91
92    build() {
93      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
94        Canvas(this.context)
95          .width('100%')
96          .height('100%')
97          .backgroundColor('#ffff00')
98          .onReady(() => {
99            this.context.drawImage(this.img, 0, 0, 500, 500, 0, 0, 400, 200)
100            this.img.close()
101          })
102      }
103      .width('100%')
104      .height('100%')
105    }
106  }
107  ```
108
109  ![zh-cn_image_0000001194352442](figures/zh-cn_image_0000001194352442.png)
110
111### 示例2(创建ImageBitmap)
112
113通过PixelMap创建ImageBitmap对象。
114
115  ```ts
116// xxx.ets
117@Entry
118@Component
119struct Demo {
120  private settings: RenderingContextSettings = new RenderingContextSettings(true)
121  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
122
123  build() {
124    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
125      Canvas(this.context)
126        .width('100%')
127        .height('50%')
128        .backgroundColor('#ffff00')
129        .onReady(() => {
130          this.context.fillStyle = "#00ff00"
131          this.context.fillRect(0, 0, 100, 100)
132          let pixel = this.context.getPixelMap(0, 0, 100, 100)
133          let image = new ImageBitmap(pixel)
134          this.context.drawImage(image, 100, 100)
135        })
136
137    }
138    .width('100%')
139    .height('100%')
140  }
141}
142  ```
143
144  ![zh-cn_image_0000001194352442](figures/zh-cn_image_0000001194352444.png)
145
146
147### 示例3(支持并发线程绘制)
148
149通过创建Worker线程,实现并发线程绘制。
150
151```ts
152import { worker } from '@kit.ArkTS';
153
154@Entry
155@Component
156struct imageBitmapExamplePage {
157  private settings: RenderingContextSettings = new RenderingContextSettings(true);
158  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
159  private myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ts');
160  private img:ImageBitmap = new ImageBitmap("common/images/example.jpg")
161
162  build() {
163    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
164      Canvas(this.context)
165        .width('100%')
166        .height('100%')
167        .backgroundColor('#ffff00')
168        .onReady(() => {
169          this.myWorker.postMessage({ myImage: this.img });
170          this.myWorker.onmessage = (e): void => {
171            if (e.data.myImage) {
172              let image: ImageBitmap = e.data.myImage
173              this.context.transferFromImageBitmap(image)
174            }
175          }
176        })
177    }
178    .width('100%')
179    .height('100%')
180  }
181}
182```
183Worker线程在onmessage中接收到主线程postMessage发送的ImageBitmap,并进行绘制。
184
185```ts
186workerPort.onmessage = function (e: MessageEvents) {
187  if (e.data.myImage) {
188    let img = e.data.myImage
189    let offCanvas = new OffscreenCanvas(600, 600)
190    let offContext = offCanvas.getContext("2d")
191    offContext.drawImage(img, 0, 0, 500, 500, 0, 0, 400, 200)
192    let image = offCanvas.transferToImageBitmap()
193    workerPort.postMessage({ myImage: image });
194  }
195}
196```
197
198  ![zh-cn_image_0000001194352442](figures/zh-cn_image_0000001194352442.png)