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
问题2:
要将PixelMap转换为Base64字符串,您可以按照以下步骤进行操作:
- 将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();
}
}
- 将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的解决方案如下:
- 使用
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));
}
}
});
- 使用
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);
- 使用
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 呢?
这个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,鸿蒙还提供了Image
和ImagePacker
等类,支持图像的加载、编辑和打包。
总之,鸿蒙Next中的媒体、PixelMap与Base64的应用涵盖了图像处理、数据传输和媒体播放等多个方面,开发者可以通过系统提供的API实现丰富的功能。
在HarmonyOS鸿蒙Next中,媒体、PixelMap与Base64的应用如下:
-
媒体处理:通过
MediaLibrary
和Player
等API,开发者可以访问和管理设备上的媒体文件,如音频、视频和图片,并进行播放、编辑等操作。 -
PixelMap:
PixelMap
是用于处理图像数据的类,支持图像的加载、解码、缩放、裁剪等操作。开发者可以通过ImageSource
或PixelMap
直接操作图像像素数据。 -
Base64编码:Base64用于将二进制数据(如图片)编码为文本格式,便于在网络传输或存储中使用。鸿蒙提供了
util
模块中的Base64
类,支持编码和解码操作。
这些功能结合使用,可以实现复杂的媒体处理和图像操作,满足多样化的应用需求。