鸿蒙:将Resource类型的image转成 image.PixelMap 类型

《博客目录》

[1. 博客前言](#1. 博客前言)

[2. 参考链接](#2. 参考链接)

[3. 核心代码](#3. 核心代码)

[4. 运行效果](#4. 运行效果)

[5. 完整代码](#5. 完整代码)


1. 前言

有些时候,我们使用某些显示图片的组件时,发现只能填入image.PixelMap格式的图片,此时,我们需要转换类型。本篇博客,分享Resource 类型如何转换成image.PixelMap 类型(或获取Resource图片的PixelMap)。

2. 参考链接

https://developer.huawei.com/consumer/cn/forum/topic/0203192799649268451?fid=0109140870620153026https://developer.huawei.com/consumer/cn/forum/topic/0203192799649268451?fid=0109140870620153026

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-image-6https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-image-6

3. 核心代码

复制代码
getImagePixelMap1() {
  // 获取 resourceManager
  let resManager = this.getUIContext().getHostContext()?.resourceManager;
  // 通过资源ID获取 DrawableDescriptor
  let drawableDesc: DrawableDescriptor =
    resManager?.getDrawableDescriptor($r('app.media.huawei').id) as DrawableDescriptor;
  // 获取 PixelMap
  this.pixelMap = drawableDesc?.getPixelMap();
}

async getPixelMapFromResource(context: Context) {
  // 1. 获取 resourceManager
  const resourceMgr = context.resourceManager;
  // 2. 获取媒体内容的 ArrayBuffer
  const fileData = await resourceMgr.getMediaContent($r('app.media.pingguo').id);
  const buffer = fileData.buffer;
  // 3. 创建 ImageSource 并解码为 PixelMap
  const imageSource = image.createImageSource(buffer);
  this.pixelMap2 = await imageSource.createPixelMap();

}

getPixelMap3() {
  try {
    let uris: Array<string> = [];
    let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    PhotoSelectOptions.maxSelectNumber = 1;
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      console.info('photoPicker.select successfully, PhotoSelectResult uri: ' +
      JSON.stringify(PhotoSelectResult));
      uris = PhotoSelectResult.photoUris;
      let phAccessHelper =
        photoAccessHelper.getPhotoAccessHelper(this.getUIContext().getHostContext() as Context);
      let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
      // Configure query conditions, use PhotoViewPicker to select the URI of the image to be queried
      predicates.equalTo('uri', uris[0]);
      let fetchOptions: photoAccessHelper.FetchOptions = {
        fetchColumns: [],
        predicates: predicates
      };
      phAccessHelper.getAssets(fetchOptions, async (err, fetchResult) => {
        if (fetchResult !== undefined) {
          console.info('fetchResult success');
          let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
          if (photoAsset !== undefined) {
            // Get Thumbnail
            photoAsset.getThumbnail((err, pixelMap) => {
              if (err == undefined) {
                this.pixelMap3 = pixelMap;
                console.info('getThumbnail successful ' + JSON.stringify(pixelMap));
              } else {
                console.error('getThumbnail fail', err);
              }
            });
            console.info('photoAsset.displayName : ' + photoAsset.displayName);
          }
        } else {
          console.error(`fetchResult fail with error: ${err.code}, ${err.message}`);
        }
      });
    }).catch((err: BusinessError) => {
      console.error('photoPicker.select failed with err: ' + JSON.stringify(err));
    });
  } catch (error) {
    let err: BusinessError = error as BusinessError;
    console.error('photoPicker failed with err: ' + JSON.stringify(err));
  }
}

4. 运行效果

5. 完整代码

Index.ets

复制代码
import { image } from '@kit.ImageKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@ComponentV2
struct Index {
  @Local pixelMap: image.PixelMap | undefined = undefined;
  @Local pixelMap2: image.PixelMap | undefined = undefined;
  @Local pixelMap3: image.PixelMap | undefined = undefined;

  getImagePixelMap1() {
    // 获取 resourceManager
    let resManager = this.getUIContext().getHostContext()?.resourceManager;
    // 通过资源ID获取 DrawableDescriptor
    let drawableDesc: DrawableDescriptor =
      resManager?.getDrawableDescriptor($r('app.media.huawei').id) as DrawableDescriptor;
    // 获取 PixelMap
    this.pixelMap = drawableDesc?.getPixelMap();
  }

  async getPixelMapFromResource(context: Context) {
    // 1. 获取 resourceManager
    const resourceMgr = context.resourceManager;
    // 2. 获取媒体内容的 ArrayBuffer
    const fileData = await resourceMgr.getMediaContent($r('app.media.pingguo').id);
    const buffer = fileData.buffer;
    // 3. 创建 ImageSource 并解码为 PixelMap
    const imageSource = image.createImageSource(buffer);
    this.pixelMap2 = await imageSource.createPixelMap();

  }

  getPixelMap3() {
    try {
      let uris: Array<string> = [];
      let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
      PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
      PhotoSelectOptions.maxSelectNumber = 1;
      let photoPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        console.info('photoPicker.select successfully, PhotoSelectResult uri: ' +
        JSON.stringify(PhotoSelectResult));
        uris = PhotoSelectResult.photoUris;
        let phAccessHelper =
          photoAccessHelper.getPhotoAccessHelper(this.getUIContext().getHostContext() as Context);
        let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
        // Configure query conditions, use PhotoViewPicker to select the URI of the image to be queried
        predicates.equalTo('uri', uris[0]);
        let fetchOptions: photoAccessHelper.FetchOptions = {
          fetchColumns: [],
          predicates: predicates
        };
        phAccessHelper.getAssets(fetchOptions, async (err, fetchResult) => {
          if (fetchResult !== undefined) {
            console.info('fetchResult success');
            let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
            if (photoAsset !== undefined) {
              // Get Thumbnail
              photoAsset.getThumbnail((err, pixelMap) => {
                if (err == undefined) {
                  this.pixelMap3 = pixelMap;
                  console.info('getThumbnail successful ' + JSON.stringify(pixelMap));
                } else {
                  console.error('getThumbnail fail', err);
                }
              });
              console.info('photoAsset.displayName : ' + photoAsset.displayName);
            }
          } else {
            console.error(`fetchResult fail with error: ${err.code}, ${err.message}`);
          }
        });
      }).catch((err: BusinessError) => {
        console.error('photoPicker.select failed with err: ' + JSON.stringify(err));
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error('photoPicker failed with err: ' + JSON.stringify(err));
    }
  }

  aboutToAppear(): void {
    this.getImagePixelMap1();
    this.getPixelMapFromResource(this.getUIContext().getHostContext() as Context);
  }

  build() {

    Column({ space: 80 }) {
      Column({ space: 20 }) {
        Text("方式一: DrawableDescriptor ")
          .fontWeight(FontWeight.Medium)
          .fontSize(20)
        Image(this.pixelMap)
          .width(350)
      }

      Column({ space: 20 }) {
        Text("方式二: resourceManager.getMediaContent ")
          .fontWeight(FontWeight.Medium)
          .fontSize(20)
        Image(this.pixelMap2)
          .width(100)
      }

      Column({ space: 20 }) {
        Text("方式三: getThumbnail ")
          .fontWeight(FontWeight.Medium)
          .fontSize(20)
        Button("获取位图")
          .onClick(() => {
            this.getPixelMap3()

          })
        Image(this.pixelMap3)
          .width(100)
      }

    }

    .width
    ("100%")
    .height
    ("100%")
    .justifyContent
    (FlexAlign.Center)
  }
}

觉得有帮助,可以点赞或收藏

相关推荐
李二。27 分钟前
鸿蒙 HarmonyOS 校园风登录页面开发实战 —— 基于 ArkTS 的 Stage 模型完整教程
华为·harmonyos
大雷神30 分钟前
第30篇|图片文件落盘:沙箱路径、Uri 与后续读取
harmonyos
枫叶丹433 分钟前
【HarmonyOS 6.0】Live View Kit 实况窗开发详解:进度胶囊支持副文本功能探究
开发语言·华为·harmonyos
想你依然心痛1 小时前
HarmonyOS 6(API 23)智能体驱动的沉浸式AR城市地下管网运维中心
运维·ar·harmonyos·智能体
非凡大爹2 小时前
实验十 华为路由器和交换机实现RIP 动态路由协议配置实验指导书
运维·网络·计算机网络·华为
Goway_Hui2 小时前
【鸿蒙原生应用开发--ArkUI--014】Expense-tracker 记账应用开发教程
华为·harmonyos
不羁的木木2 小时前
《HarmonyOS技术精讲》五:实战项目 ── 智能支架助手
华为·harmonyos
枫叶丹42 小时前
【HarmonyOS 6.0】Map Kit瓦片图层深度解析:本地加载方式与瓦片数据缓存能力
开发语言·缓存·华为·harmonyos
大雷神2 小时前
第29篇|单拍按钮背后:从点击到 PhotoOutput 回调
harmonyos
不羁的木木2 小时前
《HarmonyOS底部页签-沉浸光感组件实战》模糊样式:打造毛玻璃效果
华为·harmonyos