HarmonyOS 鸿蒙Next image.createPixelMap返回undefined的问题

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

HarmonyOS 鸿蒙Next image.createPixelMap返回undefined的问题 调用系统相册选择一张图片,拿到图片的uri,转成PixelMap,再用packing压缩一下得到压缩后的ArrayBuffer,最后用image.createPixelMap转成压缩后的PixelMap,返回的是undefined

2 回复

参考此demo:

import { picker } from '@kit.CoreFileKit';
import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import util from '@ohos.util';

@Entry
@Component
struct pickImg {
  uri: string = '';
  resultBase64Str: string = ''
  pixelMap?: image.PixelMap = undefined;
  selectUris: Array<string> = [];
  @State pixelStr: string = '';
  build() {
    Column() {
      Image(this.pixelMap).width(200).height(200)
      Button('打开相册').onClick(() => {
        const photoViewPicker = new picker.PhotoViewPicker();
        photoViewPicker.select().then(async (photoSelectResult: picker.PhotoSelectResult) => {
          this.selectUris = photoSelectResult.photoUris;
          console.info('photoViewPicker.select to file succeed and uris are:' + this.selectUris);
          let file = fs.openSync(this.selectUris[0], fs.OpenMode.READ_ONLY);
          console.info('file fd: ' + file.fd);
          const imageSource: image.ImageSource = image.createImageSource(file.fd);
          fs.closeSync(file);
          let decodingOptions: image.DecodingOptions = { editable: true, desiredPixelFormat: 3, }
          imageSource.createPixelMap(decodingOptions).then(async (pixelMap1: image.PixelMap) => {
            this.pixelMap = pixelMap1;
          });
        }).catch((err: BusinessError) => {
          console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
        })
      })
      Button('转base64')
        .onClick(() => {
          const imagePackerApi = image.createImagePacker();
          const packOptions: image.PackingOption = { format: 'image/jpeg', quality: 10 }
          imagePackerApi.packing(this.pixelMap, packOptions).then(async (data: ArrayBuffer) => {
            let arrayBuffer = data;
            console.log('arrayBuffer', arrayBuffer)
            let base64 = new util.Base64Helper();
            let uint8Arr = new Uint8Array(arrayBuffer)
            this.pixelStr = base64.encodeToStringSync(uint8Arr)
          }).catch((error: BusinessError) => {
            console.error('Failed to pack the image. And the error is: ' + error);
          })
        })
      Image('data:image/png;base64,'+this.pixelStr)
        .height('50%')
        .width('50%')
    }
  }
}

更多关于HarmonyOS 鸿蒙Next image.createPixelMap返回undefined的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS(鸿蒙)中image.createPixelMap返回undefined的问题,这通常表明在调用该方法时,某些必要的条件或参数未正确设置或传递。以下是一些可能的原因及解决方案的简述:

  1. 资源路径错误:确保传递给createPixelMap的资源路径是正确的,并且该资源文件存在于指定的路径下。路径错误或文件缺失会导致方法返回undefined

  2. 资源格式不支持:createPixelMap可能不支持某些图像格式。检查图像文件的格式是否为系统所支持。

  3. 权限问题:应用程序可能没有足够的权限访问指定的资源文件。确保应用已声明并获得了访问该资源的必要权限。

  4. 资源加载时机:如果资源是在异步过程中加载的,可能在资源实际可用之前就调用了createPixelMap。确保资源已完全加载后再进行调用。

  5. API使用错误:检查createPixelMap的调用方式是否符合API文档的描述,包括参数的类型和顺序。

如果以上检查均无误,但问题依旧存在,可能是系统或框架的bug。此时,建议直接联系鸿蒙系统的官方支持团队以获取进一步的帮助。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部