HarmonyOS 鸿蒙Next “仿微信聊天”App开发技术分享(十二)把图片转为BASE64字符串
HarmonyOS 鸿蒙Next “仿微信聊天”App开发技术分享(十二)把图片转为BASE64字符串 上一节我们利用photoAccessHelper实现了从相册挑选图片的功能,但是SocketIO不支持传输二进制数据,只允许传输文本字符串,那么得想办法把图片数据转成字符串才行。
由于图片数据转字符串的操作要求可逆,也就是图片转成字符串之后,还能把字符串恢复成原图片,因此这种转换必须是无损操作。基于以上考虑,可把图片内容的二进制数据通过BASE64算法重新编码成十六进制的字符串,对应的反向操作就是,把十六进制的BASE64字符串解码成为二进制的图片数据。
对于鸿蒙App来说,图片文件转BASE64串的具体过程包含以下四个步骤。
一、获取图片文件的文件描述符
操作图片文件之前,要先打开该文件,为此需引入文件处理库fileIo,也就是在ETS代码开头添加下面的导包语句:
import { fileIo } from '@kit.CoreFileKit';
接着调用fileIo.openSync方法打开指定路径的图片文件,该方法返回一个File类型的文件对象,File对象里面的fd字段即为文件描述符。具体的文件打开代码如下:
let fileName = this.imagePath.toString().split('/').pop() as string
let suffix = (fileName.split('.').pop() as string).toLowerCase()
let fileFormat = suffix=='png' ? 'image/png' : 'image/jpeg'
let file = fileIo.openSync(this.imagePath, fileIo.OpenMode.READ_ONLY);
console.info(`fileName: ${fileName}, format:${fileFormat}, fileFd: ${file.fd}`);
二、把图片文件转换为像素图PixelMap
图片文件与像素图的互转属于图像处理操作,需要引入专门的图像库image,也就是在ETS代码开头添加下面的导包语句:
import { image } from '@kit.ImageKit';
接着调用image.createImageSource方法,从指定的文件描述符中获取ImageSource类型的图像来源对象。再调用ImageSource对象的createPixelMap方法,通过异步方式获得对应的PixelMap像素图数据。具体的像素图获取代码如下:
let imageSource = image.createImageSource(file.fd);
imageSource.createPixelMap().then((pixelMap) => {
// 这里暂时省略对像素图pixelMap的处理操作
}).catch((err: BusinessError) => {
console.error('createPixelMap failed with err: ' + JSON.stringify(err));
});
三、把像素图对象转换为二进制数据
把像素图转换为二进制的过程,需要引入专门的缓存库buffer,也就是在ETS代码开头添加下面的导包语句:
import { buffer } from '@kit.ArkTS';
接着结合imageku和buffer库把像素图转成二进制数据,详细的转换步骤说明如下:
- 先调用image.createImagePacker方法,获得ImagePacker类型的图像打包器对象;
- 再调用ImagePacker对象的packing方法,通过异步方式从指定的像素图中获取ArrayBuffer数组缓存;
- 然后调用buffer.from方法,从ArrayBuffer缓存中获得二进制数据,其数据类型为buffer.Buffer。
详细的二进制数据转换代码如下:
const imagePackerApi: image.ImagePacker = image.createImagePacker();
let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {
let buf: buffer.Buffer = buffer.from(data);
let count = Math.floor(buf.length/this.blockSize) + 1;
console.info(`sendImage length=${buf.length}, count=${count}`);
// 这里暂时省略对二进制数据的BASE64编码操作
}).catch((err: BusinessError) => {
console.error('packing failed with err: ' + JSON.stringify(err));
});
四、把二进制数据编码成BASE64字符串
调用buffer.Buffer的toString方法,字符编码参数填base64,即可将二进制数据转换成BASE64格式的字符串。具体的转换代码如下:
let encodeData = buf.toString('base64');
经过上述几个步骤的转换处理过程,总算把图片文件转成了BASE64字符串,才能把图片数据以BASE64串的形式发送给SocketIO服务器。
下一篇文章会介绍如何把BASE64字符串转换为像素图。
更多关于HarmonyOS 鸿蒙Next “仿微信聊天”App开发技术分享(十二)把图片转为BASE64字符串的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next “仿微信聊天”App开发技术分享(十二)把图片转为BASE64字符串的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中,将图片转换为BASE64字符串是一个常见的需求,特别是在开发“仿微信聊天”这类应用时,图片经常需要在客户端与服务器之间传输。以下是实现这一功能的关键步骤:
-
读取图片数据:首先,需要从资源文件或存储中获取图片的二进制数据。在HarmonyOS中,可以使用
File
类读取图片文件,或者使用BitmapFactory
从资源中加载位图。 -
转换为字节数组:将读取到的图片数据(如
Bitmap
对象)转换为字节数组。对于Bitmap
对象,可以通过compress
方法将其压缩为字节数组。 -
编码为BASE64字符串:使用Java内置的
Base64
类(注意,这里虽提及Java类,但仅作为说明编码过程,实际在鸿蒙开发中应使用鸿蒙提供的API或第三方库实现相同功能,避免直接依赖Java标准库)将字节数组编码为BASE64字符串。鸿蒙系统可能提供类似功能的API,或开发者可寻找适合的第三方库来完成此步骤。
示例代码框架(假设鸿蒙系统有类似Java的Base64编码API):
// 伪代码,具体实现需参考鸿蒙API文档
byte[] imageBytes = ...; // 从图片获取的字节数组
String base64String = Base64.encodeToString(imageBytes, Base64.DEFAULT);
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html,