HarmonyOS鸿蒙Next中媒体、pixelMap与base64的应用

HarmonyOS鸿蒙Next中媒体、pixelMap与base64的应用 依据api9,arkts开发harmonyOS,使用@ohos.file.picker (选择器)打开相册后,想要把选的图片转成base64传H5,大致思路就是通过PhotoSelectResult返回的uri拿到pixelMap,在把pixelMap转成base64,但是现在遇到了问题。

问题1: PhotoSelectResult返回的uri是file://media/Photo/2,createImageSource不能访问这个地址的图片,如何把file://media/Photo/2图片转换成pixelMap?

问题2: 如何将pixelMap转成base64


更多关于HarmonyOS鸿蒙Next中媒体、pixelMap与base64的应用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

21 回复

cke_182.png

更多关于HarmonyOS鸿蒙Next中媒体、pixelMap与base64的应用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


问题2:

要将PixelMap转换为Base64字符串,您可以按照以下步骤进行操作:

  1. 将PixelMap转换为ByteArray。
import ohos.agp.graphics.PixelMap;
import ohos.agp.graphics.Surface;
import ohos.app.Context;
import ohos.media.image.ImageSource;
import ohos.media.image.common.PixelFormat;
import ohos.media.image.common.Rect;
import ohos.media.image.common.Size;

PixelMap pixelMap = ...; // 从相册中选择的PixelMap对象
Surface surface = null;
byte[] byteArray = null;

try {
    surface = Surface.createFromPixelMap(pixelMap);
    ImageSource imageSource = ImageSource.create(surface);
    byteArray = imageSource.readBytes();
} catch (IOException e) {
    // 处理异常
} finally {
    if (surface != null) {
        surface.release();
    }
    if (pixelMap != null) {
        pixelMap.release();
    }
}
  1. 将ByteArray转换为Base64字符串。
import java.util.Base64;

String base64 = Base64.getEncoder().encodeToString(byteArray);

现在,您可以使用base64变量,它包含了PixelMap转换后的Base64字符串。请注意,上述代码中使用了Java 8的Base64类,如果您的项目不支持Java 8,请使用其他Base64编码库来进行转换。

您好,是依据api9,arkts开发harmonyOS,不是使用Java,也谢谢您的答复。

问题1的解决方案如下:

  1. 使用MediaLibrary API获取文件的真实路径。
import ohos.media.photokit.metadata.AVStorage;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolume;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolumeState;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolumeSummary;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolumeSummaryCallback;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolumeSummaryResult;
import ohos.media.photokit.metadata.AVStorage.AVStorageVolumeSummaryResultCallback;

String uriString = "file://media/Photo/2";
Uri uri = Uri.parse(uriString);
String path = null;

AVStorageVolumeSummaryCallback callback = new AVStorageVolumeSummaryCallback() {
    @Override
    public void onSummary(AVStorageVolumeSummaryResult result) {
        if (result != null && result.getVolumes() != null && !result.getVolumes().isEmpty()) {
            AVStorageVolume volume = result.getVolumes().get(0);
            if (volume.getState() == AVStorageVolumeState.MOUNTED) {
                path = volume.getPath();
            }
        }
    }
};

AVStorage.querySummary(new AVStorageVolumeSummaryResultCallback() {
    @Override
    public void onSummaryResult(AVStorageVolumeSummaryResult result) {
        if (result != null && result.getSummaries() != null && !result.getSummaries().isEmpty()) {
            callback.onSummary(result.getSummaries().get(0));
        }
    }
});
  1. 使用PixelMap API将图片转换为PixelMap对象。
import ohos.agp.graphics.PixelMap;
import ohos.agp.graphics.Surface;
import ohos.app.Context;
import ohos.media.image.ImageSource;
import ohos.media.image.common.PixelFormat;
import ohos.media.image.common.Rect;
import ohos.media.image.common.Size;
import ohos.media.image.common.SourceMetadata;
import ohos.media.image.common.SourceMetadata.ExifInfo;
import ohos.media.image.common.SourceMetadata.ExifKey;
import ohos.media.image.common.SourceMetadata.ExifType;
import ohos.media.image.common.SourceMetadata.ImageOrientation;
import ohos.media.image.common.SourceMetadata.Rational;

String filePath = path + uri.getPath();
ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
srcOpts.formatHint = "image/jpeg";
srcOpts.sliceHeight = 0;
srcOpts.sliceWidth = 0;

ImageSource imageSource = ImageSource.create(filePath, srcOpts);
ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
decodingOpts.desiredSize = new Size(0, 0);
decodingOpts.desiredRegion = new Rect(0, 0, 0, 0);
decodingOpts.desiredPixelFormat = PixelFormat.ARGB_8888;

PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);
  1. 使用ImageSource API将PixelMap转换为Base64字符串。
import ohos.agp.utils.MemoryCleanerRegistry;
import ohos.agp.utils.MemoryCleaner;

String base64 = null;
Surface surface = null;

try {
    surface = Surface.createFromPixelMap(pixelMap);
    ImageSource imageSource = ImageSource.create(surface);
    byte[] bytes = imageSource.readBytes();
    base64 = Base64.getEncoder().encodeToString(bytes);
} catch (IOException e) {
    // handle exception
} finally {
    if (surface != null) {
        surface.release();
    }
    if (pixelMap != null) {
        pixelMap.release();
    }
}

请注意,上述代码仅为示例代码,您需要根据实际情况进行适当的修改和错误处理。

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

您好,是依据api9,arkts开发harmonyOS,不是使用Java,也谢谢您的答复。

有解决的吗?

时间太久了,当时没找到方法。

我试了下使用packing能拿到array,接下来提供个思路,感兴趣的同学可以接力下去,通过Base64Helper9的encodeToStringSync转一下,应该可以,实现的同学做出来可以给大家解答一下哈

也是一样,获取不到base64位的。

大佬,pixelMap转成base64找到方法了吗

大佬有找到吗?

期待HarmonyOS能继续优化多屏协同功能,让跨设备体验更加完美。

import picker from '@ohos.file.picker';
import image from '@ohos.multimedia.image';
import fs from '@ohos.file.fs';

@Entry
@Component
struct Index {
  @State message: string = '选择图片'
  @State icon: PixelMap = null
  @State uri: string = ''

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(click => {
            const photoSelectOptions = new picker.PhotoSelectOptions();
            photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
            photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目
            const photoPicker = new picker.PhotoViewPicker();
            photoPicker.select(photoSelectOptions).then(photoSelectResult => {
              this.uri = photoSelectResult.photoUris[0];
              const file = fs.openSync(this.uri, fs.OpenMode.READ_ONLY);
              const fd = file?.fd;
              // path为已获得的沙箱路径
              const imageSource = image.createImageSource(fd);
              imageSource.createPixelMap().then(pixelMap => {
                this.icon = pixelMap;
              })
            }).catch(err => {
              console.error(`Invoke photoPicker.select failed, code is ${err.code}, message is ${err.message}`);
            })
          })
        Image(this.icon)
          .width(200)
          .height(200)
          .margin({ top: 100 })
          .objectFit(ImageFit.Contain)
      }
      .width('100%')
    }
    .height('100%')
  }
}

实测可行,图片可以展示

嗯嗯,沙盒的没问题,非沙盒的相册目前还没有对外展示。

请问,如何把这个 this.icon = pixelMap; 转换成 base64 呢?

我用base64helper试了下,但是没有成功,你可以看下这个

这个uri是非沙盒地址,不行的,

依据api9,arkts开发harmonyOS,不是使用Java,请问有详细文档或者demo吗?辛苦大佬进来指导指导

在HarmonyOS鸿蒙Next中,媒体、PixelMap与Base64的应用主要涉及图像处理和数据传输。PixelMap是鸿蒙系统中用于表示图像数据的对象,支持对图像进行各种操作,如缩放、裁剪和旋转。Base64则是一种编码方式,常用于将二进制数据(如图像)转换为文本格式,以便在文本协议(如JSON、XML)中传输。

在鸿蒙Next中,开发者可以通过Image组件加载和显示PixelMap图像。PixelMap可以通过ImageSource类从资源文件、网络或本地文件系统中创建。例如,使用ImageSource.createFromUri方法可以从指定的URI创建PixelMap对象。

Base64编码在鸿蒙中常用于将图像数据转换为字符串格式,以便在网络传输或存储时使用。鸿蒙提供了util模块中的Base64类,支持将二进制数据编码为Base64字符串,或将Base64字符串解码为二进制数据。例如,使用Base64.encodeToString方法可以将PixelMap的二进制数据编码为Base64字符串,而Base64.decode方法则可以将Base64字符串解码为二进制数据。

在媒体处理方面,鸿蒙Next提供了丰富的API支持音频、视频和图像的播放、录制和编辑。开发者可以使用MediaPlayer类播放音频和视频,使用Recorder类进行音频和视频的录制。对于图像处理,除了PixelMap,鸿蒙还提供了ImageImagePacker等类,支持图像的加载、编辑和打包。

总之,鸿蒙Next中的媒体、PixelMap与Base64的应用涵盖了图像处理、数据传输和媒体播放等多个方面,开发者可以通过系统提供的API实现丰富的功能。

在HarmonyOS鸿蒙Next中,媒体、PixelMap与Base64的应用如下:

  1. 媒体处理:通过MediaLibraryPlayer等API,开发者可以访问和管理设备上的媒体文件,如音频、视频和图片,并进行播放、编辑等操作。

  2. PixelMap:PixelMap是用于处理图像数据的类,支持图像的加载、解码、缩放、裁剪等操作。开发者可以通过ImageSourcePixelMap直接操作图像像素数据。

  3. Base64编码:Base64用于将二进制数据(如图片)编码为文本格式,便于在网络传输或存储中使用。鸿蒙提供了util模块中的Base64类,支持编码和解码操作。

这些功能结合使用,可以实现复杂的媒体处理和图像操作,满足多样化的应用需求。

回到顶部