HarmonyOS鸿蒙Next中image.createImageSource创建ImageSource实例成功,但是实例初始化不正常,望高手指点。

HarmonyOS鸿蒙Next中image.createImageSource创建ImageSource实例成功,但是实例初始化不正常,望高手指点。

使用ArkTS进行图片开发,读取图片文件,显示出来。调用image.createImageSource(),创建ImageSource实例是创建了的,但是实例的初始化不正确。尝试过从沙箱图片中读取图片,从应用资源图片文件读取文件,也跟踪调试了,没有异常。 但是ImageSource.getImageInfo()获取的信息,图片宽、高为0,supportedFormats 数组是空的。

import {image} from '@kit.ImageKit'

@Component
struct ImageExample {
  @State pixelMap: PixelMap | null = null;
  @State imageInfo: string = '加载中...';

  async loadImage() {
    try {
      // 1. 获取资源引用
      const resource = $r('app.media.startIcon'); // resources/base/media/sample_image.png
      // 2. 创建ImageSource
      const imageSource = image.createImageSource(resource.id);
      // 3. 获取图片信息
      const info = await imageSource.getImageInfo();
      this.imageInfo = `尺寸: ${info.size.width}x${info.size.height}, 大小: ${info.size}字节`;
      // 4. 创建PixelMap(可选)
      this.pixelMap = await imageSource.createPixelMap();
    } catch (error) {
      console.error('图片加载失败:', error);
      this.imageInfo = '加载失败';
    }
  }

  aboutToAppear() {
    this.loadImage();
  }

  build() {
    Column() {
      // 显示原始资源图片
      Image($r('app.media.startIcon'))
        .width(100)
        .height(100)

      // 显示通过PixelMap创建的图片(如果加载成功)
      if (this.pixelMap) {
        Image(this.pixelMap)
          .width(100)
          .height(100)
      }

      Text(this.imageInfo)
        .margin(10)
    }
    .width('100%')
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中image.createImageSource创建ImageSource实例成功,但是实例初始化不正常,望高手指点。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

【背景知识】

image.createImageSource目前支持传入图片沙箱路径/文件描述符fd/ArrayBuffer/图像资源文件的RawFileDescriptor来创建ImageSource实例。

getRawFdSync获取resources/rawfile目录下rawfile文件所在HAP的文件描述符(fd).

【解决方案】

想指定resource资源创建ImageSource实例可参考如下代码:

import { common } from '@kit.AbilityKit';
import { resourceManager } from '@kit.LocalizationKit';
import { image } from '@kit.ImageKit';

@Entry
@Component
struct Page {
  @State pixelMap: PixelMap | null = null;
  @State imageInfo: string = '加载中...';

  async loadImage() {
    try {
      let context = this as common.UIAbilityContext
      const resourceMgr: resourceManager.ResourceManager = context.resourceManager;
      let RawFileDescriptor = resourceMgr.getRawFdSync('startIcon.png',)
      const imageSource: image.ImageSource = image.createImageSource(RawFileDescriptor);
      const info = await imageSource.getImageInfo();
      this.imageInfo = `尺寸: ${info.size.width}x${info.size.height}`;
      this.pixelMap = await imageSource.createPixelMap();
    } catch (error) {
      console.error('图片加载失败:', error);
      this.imageInfo = '加载失败';
    }
  }

  aboutToAppear(): void {
    this.loadImage()
  }

  build() {
    // 显示原始资源图片
    Image($r('app.media.startIcon'))
      .width(100)
      .height(100)

    // 显示通过PixelMap创建的图片(如果加载成功)
    if (this.pixelMap) {
      Image(this.pixelMap)
        .width(100)
        .height(100)
    }

    Text(this.imageInfo)
      .margin(10)
  }
}

【总结】

创建ImageSource实例需确认传入的参数是否正确。

更多关于HarmonyOS鸿蒙Next中image.createImageSource创建ImageSource实例成功,但是实例初始化不正常,望高手指点。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我这边还是显示不了自己加载的图片,文档里介绍的方法也都试过了。也不知是哪里出了问题,您这个能显示自己加载的图片吗?

你好,getRawFdSync是获取resources/rawfile目录下rawfile文件所在HAP的文件描述符(fd),你可以将图片资源放置resources/rawfile目录下再试试呢,还是不行的话可以提供一下报错信息。

谢谢回复。仍然是初始化不正常,无法显示图片。

resourceManager取出ArrayBuffer

```typescript
// 1. 获取资源引用
const resource = $r('app.media.startIcon');
// 2. 创建ImageSource
let arr = getContext().resourceManager.getMediaContentSync(resource);
const imageSource = image.createImageSource(arr.buffer);

在HarmonyOS Next中,ImageSource初始化异常可能由以下原因导致:

  1. 输入源数据格式不符要求
  2. 文件路径权限不足或路径错误
  3. 内存不足导致初始化失败
  4. 图像数据已损坏
  5. 当前API版本对图像格式支持不完整

检查项:

  • 确认数据源完整有效
  • 验证文件路径及读写权限
  • 检查设备剩余内存
  • 尝试不同格式图像文件

从代码和描述来看,ImageSource实例创建成功但获取不到图片信息,可能有以下几个原因:

  1. 资源路径问题:
  • 检查$r('app.media.startIcon')是否正确指向图片资源
  • 确认图片确实存在于resources/base/media/目录下
  1. 图片格式支持问题:
  • 确保图片是HarmonyOS支持的格式(如PNG、JPEG等)
  • 检查图片文件是否完整无损坏
  1. 异步加载时机问题:
  • 尝试在createImageSource后添加await延迟
  • 确保资源已完全加载后再调用getImageInfo
  1. 权限问题:
  • 检查是否声明了必要的文件访问权限
  • 沙箱路径访问需要正确权限

建议调试步骤:

  1. 先用简单图片测试
  2. 打印resource.id确认值是否正确
  3. 检查控制台是否有隐藏错误
  4. 尝试使用绝对路径测试

代码中直接使用$r引用资源是正确的做法,但需要确认资源确实存在且可访问。如果问题依旧,可能是底层资源加载的时序问题,可以尝试在createImageSource后添加短暂延迟。

回到顶部