HarmonyOS鸿蒙Next中服务卡片Canvas使用drawImage绘制本地资源图片展示不出来

HarmonyOS鸿蒙Next中服务卡片Canvas使用drawImage绘制本地资源图片展示不出来 我已经有资源图片,比如

$r('app.media.image1')

我在使用的时候先把资源图片,转化为了PixelMap,然后直接调用drawImage,但是不能正常展示。页面中也有类似用法都是可以的,是服务卡片有什么不一样的吗?以下是我资源转PixelMap的方法。

let demoImage = $r('app.media.image1')

export function loadImageSync(context:Context,resource: Resource | null | undefined): PixelMap | null {
    // 如果resource为null,则直接返回null
    if (resource == null) {
        console.log('hourlyItems', "resource")
        return null
    }
    try {
        let fileData: Uint8Array = context.resourceManager.getMediaContentSync(resource)
        const imageSource = image.createImageSource(fileData.buffer)
        // 创建并返回PixelMap对象
        const pixelMap = imageSource.createPixelMapSync()
        console.log('hourlyItems', pixelMap)
        return pixelMap
    } catch (error) {
        console.log('hourlyItems', error)
        return null
    }
}

let image = loadImageSync(demoImage)

ctx.drawImage(image,0,0,30,30)

以上代码不生效,绘制不出来,其他内容都可以正常展示


更多关于HarmonyOS鸿蒙Next中服务卡片Canvas使用drawImage绘制本地资源图片展示不出来的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

尊敬的开发者,您好!该功能正在规划中,还请关注后续版本,感谢您的理解与支持。

更多关于HarmonyOS鸿蒙Next中服务卡片Canvas使用drawImage绘制本地资源图片展示不出来的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


既然不支持PixelMap,那这种类型的功能这么做更合适呢,资源文件这么通过canvas绘制到卡片上呢,

不太清楚你的需求 直接image组件展示不行么,

Image组件展示可以,但是有些页面使用Canvas绘制的,Canvas里展示图片只能用drawImage,所以我的资源图片只能转化为PixelMap或者ImageBitmap,目前看都不太好使。ImageBitmap需要一个路径,我的资源图片没有路径,PixelMap又不支持,倒是也有一个方法,把我的图片都拷出来放文件夹路径下,倒是可以转化为ImageBitmap,但是我的资源图片不是一两个,这样也太不完美了,所以想找更合适的方法。

在HarmonyOS Next中,服务卡片使用Canvas的drawImage绘制本地资源图片不显示,可能原因包括:资源路径错误、图片格式不支持或资源未正确声明。请检查图片是否放在正确的资源目录(如resources/base/media),并在配置文件中声明资源权限。确保drawImage方法参数正确,包括图片对象和坐标尺寸。

在HarmonyOS Next的服务卡片中使用Canvas绘制本地图片时,需要注意服务卡片的资源访问限制。你的代码在普通页面可行,但在服务卡片中可能因上下文差异导致资源加载失败。

问题可能出现在:

  1. 服务卡片中$r('app.media.image1')可能无法直接获取资源引用
  2. 建议改用getContext().resourceManager.getMediaContent的异步方式加载
  3. 确保图片资源已正确放置在resources/base/media目录

可尝试修改为:

const resourceManager = getContext().resourceManager;
resourceManager.getMediaContent($r('app.media.image1').id)
  .then(fileData => {
    const imageSource = image.createImageSource(fileData.buffer);
    const pixelMap = imageSource.createPixelMapSync();
    ctx.drawImage(pixelMap, 0, 0, 30, 30);
  });

同时检查:

  • 图片尺寸是否超出Canvas绘制区域
  • 图片格式是否支持(推荐PNG/JPG)
  • 控制台是否有相关错误日志输出

服务卡片对资源加载有更严格的限制,需要确保在正确的上下文中操作。

回到顶部