HarmonyOS 鸿蒙Next图片路径地址转换

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

HarmonyOS 鸿蒙Next图片路径地址转换

图片地址如何转base64 (file://media/Photo/12/IMG_1721704847_011/IMG_20240723_111907.jpg)

3 回复

你需要将所支持格式的存档图片解码成统一的PixelMap,参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/image-decoding-V5
再将PixelMap编码成不同格式的存档图片,pixelmap使用imagePacker.packing的方法转成arraybuffer再编码Base64,参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/image-encoding-V5
参考demo:

let packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 };
let imagePackerApi = image.createImagePacker();
const context: Context = getContext(this);
const resourceMgr = context.resourceManager;
let imageBuffer = await resourceMgr.getMediaContent($r('app.media.ic_low'));
const imageSource: image.ImageSource = image.createImageSource(imageBuffer.buffer);
let decodingOptions: image.DecodingOptions = {
 editable: true,
 desiredPixelFormat: 3,
 rotate: 90
}
// 创建pixelMap并进行简单的旋转和缩放
imageSource.createPixelMap(decodingOptions).then((pixelMap: PixelMap) => {
 this.pixelMap = pixelMap
 // pixelmap 转base64 先要有一个packing的过程
 imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {
   let base64Str = buffer.from(data).toString('base64')
   let resultBase64Str = "data:image/png;base64," + base64Str
   this.resultBase64Str = resultBase64Str
 }).catch((error: BusinessError) => {
   console.error('Failed to pack the image. And the error is: ' + error);
 })
 pixelMap.release();
})
//重点提示: pixelmap转base64 不能直接转,先要加一个packing的过程,下面的方法是一个错误的实例,转出来的base64字符串不对。
let pixelMap = await imageSource.createPixelMap(opts);
console.log("pixelMap.getPixelBytesNumber():" + pixelMap.getPixelBytesNumber())
let arrayBuffer = new ArrayBuffer(pixelMap.getPixelBytesNumber());
pixelMap.readPixelsToBuffer(arrayBuffer)
console.log("arrayBuffer" + arrayBuffer)
let base64Str = buffer.from(arrayBuffer).toString(Constants.BASE_64);
let resultBase64Str = "data:image/png;base64," + base64Str

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-sandbox-directory-V5

更多关于HarmonyOS 鸿蒙Next图片路径地址转换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以参考一下,之前写的一个方法
  // 根据image uri 转换为 base64
  async transitionImageUri2Base64(uri: string) {
    // 读取图片为buffer
    const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    this.photoSize = fs.statSync(file.fd).size;
    console.info('Photo Size: ' + this.photoSize);
    let imageArraybuffer = new ArrayBuffer(this.photoSize);
    fs.readSync(file.fd, imageArraybuffer);
    fs.closeSync(file);
<span class="hljs-keyword">let</span> buf: buffer.Buffer = buffer.from(imageArraybuffer);
<span class="hljs-comment">// ps: data:image/jpg 要根据实际情况调整.</span>
<span class="hljs-keyword">const</span> base64 = <span class="hljs-string">'data:image/jpg;base64,'</span> + buf.toString(<span class="hljs-string">'base64'</span>, <span class="hljs-number">0</span>, buf.length);
<span class="hljs-comment">// 放到 image 就可以直接显示出来图片了.</span>
<span class="hljs-keyword">this</span>.imageBase64 = base64
console.info(TAG, <span class="hljs-string">'base64: '</span> + base64);

}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

在HarmonyOS(鸿蒙)系统中,处理图片路径地址转换通常涉及文件系统访问权限和路径格式转换。鸿蒙系统基于Linux内核,其文件系统路径格式与Android类似,但具体实现可能有所不同。

若你正在开发鸿蒙应用,并需要将图片路径从一种格式转换为另一种(例如,从相对路径转换为绝对路径,或从设备存储路径转换为应用私有存储路径),你可以使用鸿蒙提供的API来实现。

鸿蒙系统提供了丰富的文件访问API,如File类、Uri类以及相关的文件访问权限设置。你可以通过这些API来获取图片的绝对路径,或者将路径转换为适合在鸿蒙系统中使用的格式。

例如,如果你有一个相对路径的图片,你可以使用File类的getAbsolutePath()方法来获取其绝对路径。如果你需要处理来自外部存储的图片,确保你的应用已经获得了相应的文件访问权限。

请注意,鸿蒙系统的路径转换可能受到应用沙箱机制的限制,因此你需要确保你的应用具有访问目标路径的权限。

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

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!