HarmonyOS 鸿蒙Next CanvasRenderingContext2D 绘制图片drawImage不显示

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next CanvasRenderingContext2D 绘制图片drawImage不显示

Canvas(this.context)
  .width(150)
  .alignRules(centerParent())
  .height(150)
  .backgroundColor('#ffff00')
  .onReady(() => {
    let offContext = this.offCanvas.getContext("2d", this.settings)
    let ib = new ImageBitmap(`https://www.baidu.com/img/flexible/logo/pc/result.png`)
    offContext.drawImage(ib, 0, 0, 130, 130)
    let pixelmap = offContext.getPixelMap(150, 150, 130, 130)
    offContext.setPixelMap(pixelmap)
    let image = this.offCanvas.transferToImageBitmap()
    this.context.transferFromImageBitmap(image)
  })
参考的文档地址: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-offscreencanvasrenderingcontext2d-V5 自定义的画布画矩形。圆形。线条。文字都可以,就是图片不可以经调试代码有调用,但图片未显示

更多关于HarmonyOS 鸿蒙Next CanvasRenderingContext2D 绘制图片drawImage不显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

请参考以下代码

// xxx.ets
@Entry
@Component
struct ImageSmoothingEnabled {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Stack(){
        Text('绘制图片drawImage测试')
          .fontSize(100)
        Canvas(this.context)
          .width(150)
          .height(150)
          .backgroundColor('#ffff00')
          .onReady(()=>{
            let offContext = this.offCanvas.getContext("2d", this.settings)
            let ib = new ImageBitmap(`https://www.baidu.com/img/flexible/logo/pc/result.png`)
            offContext.drawImage(ib, 0, 0, 130, 130)
            let pixelmap = offContext.getPixelMap(150, 150, 130, 130)
            offContext.setPixelMap(pixelmap)
            let image = this.offCanvas.transferToImageBitmap()
            this.context.transferFromImageBitmap(image)
          })
      }
    }
    .width('100%')
    .height('100%')
  }
}

和地图关联到一起就算不是画到地图上同样会导致绘制图片失败,能否提供下失败的日志

用Stack组件将地图和canvas包在一起,绘制图片就可以显示,参考以下demo

import { MapComponent, MapController, MapOptions, MapStatus, SysEnum } from '@bdmap/map';
import { bundleManager } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
  callback?: (err: ESObject, mapController: MapController) => Promise<void>;
  mapController?: MapController;
  @State message: string = 'Hello World';
  // 设置地图控件参数
  mapOpt: MapOptions = new MapOptions({
    // 配置地图状态,如地图缩放等级、显示中心点、旋转角等
    mapStatus: new MapStatus({}),
    // 默认基础地图,可通过改变satelliteMap的值加载不同的底图
    shows: { satelliteMap: SysEnum.ESatelliteLayerType.NONE }
  });
  aboutToAppear(): void {
    // 地图初始化的回调
    this.callback = async (err:ESObject, mapController:MapController) => {
      if (!err) {
        // 获取地图的控制器类,用来操作地图
        this.mapController= mapController;
      }
    };
  }
  build() {
    Stack() {
      MapComponent({ onReady: this.callback, mapOptions: this.mapOpt }).width('100%').height('100%')
      CanvasCom()
    }
    .height('100%')
    .width('100%')
  }
}
@Component
export struct CanvasCom {
  @State message: string = 'Hello World';
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private img: ImageBitmap = new ImageBitmap("")
  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
  build() {
    RelativeContainer() {
      Canvas(this.context)
        .width(150)
        //.alignRules(centerParent())
        .height(150)
        .backgroundColor('#ffff00')
        .onReady(() => {
          let offContext = this.offCanvas.getContext("2d", this.settings)
          let ib = new ImageBitmap(`https://www.baidu.com/img/flexible/logo/pc/result.png`)
          offContext.drawImage(ib, 0, 0, 130, 130)
          let pixelmap = offContext.getPixelMap(150, 150, 130, 130)
          offContext.setPixelMap(pixelmap)
          let image = this.offCanvas.transferToImageBitmap()
          this.context.transferFromImageBitmap(image)
        })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next CanvasRenderingContext2D 绘制图片drawImage不显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙系统中Next CanvasRenderingContext2D的drawImage方法不显示图片的问题,可能的原因及解决方法如下:

  1. 图片资源未正确加载:

    • 确保图片资源已正确加载到应用中,且路径无误。
    • 检查图片格式是否被鸿蒙系统支持(如PNG、JPEG等)。
  2. 绘制上下文未正确设置:

    • 确认Canvas元素已被正确初始化,并且其尺寸适合绘制。
    • 检查Canvas的可见性,确保它没有被CSS隐藏或遮挡。
  3. drawImage方法使用不当:

    • 验证drawImage方法的参数是否正确,包括图片对象、源矩形、目标矩形等。
    • 如果使用了异步加载图片(如通过fetch或XMLHttpRequest),确保drawImage在图片加载完成后调用。
  4. 系统或框架bug:

    • 检查是否为鸿蒙系统的已知问题或框架的bug。
    • 查阅鸿蒙系统的官方文档或更新日志,看是否有相关修复。

如果以上方法均未能解决问题,可能是由于特定场景或代码实现中的其他问题。此时,建议直接联系鸿蒙系统的技术支持或查阅更多专业资源。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部