harmony 鸿蒙ImageBitmap

  • 2025-06-12
  • 浏览 (6)

ImageBitmap

ImageBitmap对象可以存储canvas渲染的像素数据。

说明:

从 API version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

接口

ImageBitmap12+

ImageBitmap(data: PixelMap, unit?: LengthMetricsUnit)

通过PixelMap创建ImageBitmap对象。

原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
data PixelMap 图片的数据源支持PixelMap对象。
unit LengthMetricsUnit 用来配置ImageBitmap对象的单位模式,配置后无法动态更改,配置方法同CanvasRenderingContext2D
默认值:DEFAULT

ImageBitmap

ImageBitmap(src: string, unit?: LengthMetricsUnit)

通过ImageSrc创建ImageBitmap对象。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
src string 图片的数据源支持本地图片。
1、string格式用于加载本地图片,例如ImageBitmap(“common/images/example.jpg”),type为”entry”和”feature”类型的Module,其图片加载路径的起点为当前Module的ets文件夹,type为”har”和”shared”类型的Module,其图片加载路径的起点为当前构建的”entry”或”feature”类型Module的ets文件夹。
type为”har”和”shared”类型的Module中推荐使用ImageSource图片解码方式将资源图片解码为统一的PixelMap加载使用。
2、支持本地图片类型:bmp、jpg、png、svg和webp类型。
说明:
- ArkTS卡片上不支持http://等网络相关路径前缀、datashare://路径前缀以及file://data/storage路径前缀的字符串。
unit12+ LengthMetricsUnit 用来配置ImageBitmap对象的单位模式,配置后无法动态更改,配置方法同CanvasRenderingContext2D
默认值:DEFAULT

属性

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 类型 只读 可选 描述
width number ImageBitmap的像素宽度。
默认单位为vp。
height number ImageBitmap的像素高度。
默认单位为vp。

close

close(): void

释放ImageBitmap对象相关联的所有图形资源,并将ImageBitmap对象的宽高置为0。close示例代码同创建ImageBitmap代码。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

ImageBitmap支持并发线程绘制

从API version 11开始,当应用创建Worker线程,支持使用postMessage将ImageBitmap实例传到Worker中进行绘制,并使用onmessage接收Worker线程发送的绘制结果进行显示。

示例

示例1(加载图片)

通过ImageBitmap加载本地图片。

  // xxx.ets
  @Entry
  @Component
  struct ImageExample {
    private settings: RenderingContextSettings = new RenderingContextSettings(true);
    private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
    private img: ImageBitmap = new ImageBitmap("common/images/example.jpg");

    build() {
      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
        Canvas(this.context)
          .width('100%')
          .height('100%')
          .backgroundColor('#ffff00')
          .onReady(() => {
            this.context.drawImage(this.img, 0, 0, 500, 500, 0, 0, 400, 200)
            this.img.close()
          })
      }
      .width('100%')
      .height('100%')
    }
  }

zh-cn_image_0000001194352442

示例2(创建ImageBitmap)

通过PixelMap创建ImageBitmap对象。

// xxx.ets
@Entry
@Component
struct Demo {
  private settings: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('50%')
        .backgroundColor('#ffff00')
        .onReady(() => {
          this.context.fillStyle = "#00ff00"
          this.context.fillRect(0, 0, 100, 100)
          let pixel = this.context.getPixelMap(0, 0, 100, 100)
          let image = new ImageBitmap(pixel)
          this.context.drawImage(image, 100, 100)
        })

    }
    .width('100%')
    .height('100%')
  }
}

zh-cn_image_0000001194352442

示例3(支持并发线程绘制)

通过创建Worker线程,实现并发线程绘制。

说明:

DevEco Studio的预览器不支持显示在worker线程中绘制的内容。

import { worker } from '@kit.ArkTS';

@Entry
@Component
struct imageBitmapExamplePage {
  private settings: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
  private myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ts');
  private img: ImageBitmap = new ImageBitmap("common/images/example.jpg");

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffff00')
        .onReady(() => {
          this.myWorker.postMessage({ myImage: this.img });
          this.myWorker.onmessage = (e): void => {
            if (e.data.myImage) {
              let image: ImageBitmap = e.data.myImage
              this.context.transferFromImageBitmap(image)
            }
          }
        })
    }
    .width('100%')
    .height('100%')
  }
}

Worker线程在onmessage中接收到主线程postMessage发送的ImageBitmap,并进行绘制。

workerPort.onmessage = (e: MessageEvents) => {
  if (e.data.myImage) {
    let img: ImageBitmap = e.data.myImage
    let offCanvas = new OffscreenCanvas(600, 600)
    let offContext = offCanvas.getContext("2d")
    offContext.drawImage(img, 0, 0, 500, 500, 0, 0, 400, 200)
    let image = offCanvas.transferToImageBitmap()
    workerPort.postMessage({ myImage: image });
  }
}

zh-cn_image_0000001194352442

你可能感兴趣的鸿蒙文章

harmony 鸿蒙图像AI分析错误码

harmony 鸿蒙ArcButton

harmony 鸿蒙ArcSlider

harmony 鸿蒙Chip

harmony 鸿蒙ChipGroup

harmony 鸿蒙ComposeListItem

harmony 鸿蒙ComposeTitleBar

harmony 鸿蒙advanced.Counter

harmony 鸿蒙弹出框 (Dialog)

harmony 鸿蒙DialogV2

0  赞