我们在许多其他平台看到过OCR功能的应用,那么HarmonyOS在这方面的支持如何呢?我们如何能快速使用这一能力呢?使用这一能力需要注意的点有哪些呢?就让我们一起来探究吧~
【开发环境】
- 版本规则号:HarmonyOS NEXT
- 版本类型:Developer Preview2
- OpenHarmony API Version:11 Release
- compileSdkVersion:4.1.0(11)
- IDE:DevEco Studio 4.1.3.700(Mac)
实现目标
通过对Core Vision Kit的基础功能的实现,完成相册图片获取、OCR、相机预览,图片格式转换等功能,熟悉ArkTS的开发流程和细节,加深对HarmonyOS中各类基础库的理解。
名词解释
- Core Vision Kit:基础视觉服务
- Camera Kit:相机服务
- Core File Kit:文件基础服务
- OCR:Optical Character Recognition,通用文字识别或光学字符识别
- URI: Uniform Resource Identifier,资源标识符,本文中URI指图片资源的访问路径
核心功能
本篇所涉及的核心功能就是通用文字识别(OCR)。
OCR是通过拍照、扫描等光学输入方式,把各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。
首先,我们实现从相册选取一张图片,并识别图片上的文字的功能。这一功能的实现基于系统提供的Core Vision Kit中的OCR能力。
- 创建一个
ImageOCRUtil
类,用于封装OCR相关功能。 从CoreVisionKit
中导入textRecognition
模块,声明一个名为ImageOCRUtil
的类,并创建其new()
方法。
import { textRecognition } from '@kit.CoreVisionKit';
export class ImageOCRUtil {}
export default new ImageOCRUtil();
- 在
ImageOCRUtil
中实现图片中文字识别功能。 构建一个异步方法:async recognizeText(image: PixelMap | undefined, resultCallback: Function)
,其中PixelMap
为图像像素类,用于读取或写入图像数据以及获取图像信息。目前pixelmap序列化大小最大128MB,超过会送显失败。大小计算方式为:宽 x 高 x 每像素占用字节数。
export class ImageOCRUtil {
/**
* 文字识别
*
* @param image 图片源数据
* @param resultCallback 结果返回
* @returns
*/
async recognizeText(image: PixelMap | undefined, resultCallback: Function) {
// 非空判断
if (!image || image === undefined) {
hilog.error(0x0000, 'OCR', 'the image is not existed');
return;
}
let visionInfo: textRecognition.VisionInfo = {
pixelMap: image
};
let textConfiguration: textRecognition.TextRecognitionConfiguration = {
isDirectionDetectionSupported: false
};
textRecognition.recognizeText(visionInfo, textConfiguration, (error: BusinessError, data: textRecognition.TextRecognitionResult) => {
// 识别成功,获取结果
if (error.code == 0) {
let recognitionRes = data.toString();
// 将识别结果返回
resultCallback(recognitionRes);
}
});
}
}
- 在
ImageOCRUtil
中实现从相册获取图片URI功能。 这里需用到Core File Kit,可借助图片选择器获取图片的存储路径。
import { picker } from '@kit.CoreFileKit';
/**
* 打开相册选择图片
* @returns 异步返回图片UR