HarmonyOS鸿蒙Next中使用OCR如何识别从沙箱读取的图片?
HarmonyOS鸿蒙Next中使用OCR如何识别从沙箱读取的图片? 使用OCR如何识别从沙箱读取的图片?
开发者你好,参考以下方案:
【解决方案】
-
将本地图片存入沙箱,示例如下:
let context: Context | undefined= this.getUIContext().getHostContext() if (!context) { return } let filePath = context.cacheDir + '/image1.jpg' // 读取本地图片 let arrayBuff = context.resourceManager.getRawFileContentSync('Screenshot_2025-04-14T191059.png').buffer let fileSource = await fileIo.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); // 写入沙箱 fs.write(fileSource.fd, arrayBuff) -
将存入沙箱的图片,转换为PixelMap格式,示例如下:
imageSource = image.createImageSource(filePath); // 将图片格式转为PixelMap chooseImage = await imageSource.createPixelMap(); -
通过textRecognition.init初始化OCR服务。
-
识别图片,识别成功后获取到图片上的文字,示例如下:
textRecognition.recognizeText(visionInfo, (error: BusinessError, data: textRecognition.TextRecognitionResult) => { if (error.code !== 0) { hilog.error(0x0000, 'OCRDemo', `Failed to recognize text. Code: ${error.code}, message: ${error.message}`); return; } // 识别成功,获取对应的结果 let recognitionString = JSON.stringify(data.value); this.imageText = recognitionString hilog.info(0x0000, 'OCRDemo', `Succeeded in recognizing text: ${recognitionString}`); if(chooseImage && imageSource) { chooseImage.release(); imageSource.release(); } });
完整代码:
import { textRecognition } from '@kit.CoreVisionKit'
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
import { fileIo as fs, fileUri } from '@kit.CoreFileKit';
import { common, Context } from '@kit.AbilityKit';
let imageSource: image.ImageSource | undefined = undefined;
let chooseImage: PixelMap | undefined = undefined;
@Entry
@Component
struct Page {
@State imageText:string = ''
build() {
Column(){
Button('点击一下')
.width('60%')
.height(40)
.backgroundColor(Color.Orange)
.align(Alignment.Center)
.onClick(()=>{
setTimeout(async () => {
let context: Context | undefined= this.getUIContext().getHostContext()
if (!context) {
return
}
let filePath = context.cacheDir + '/image1.jpg'
// 读取本地图片
let arrayBuff =
context.resourceManager.getRawFileContentSync('Screenshot_2025-04-14T191059.png').buffer
let fileSource = await fileIo.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入沙箱
fs.write(fileSource.fd, arrayBuff)
imageSource = image.createImageSource(filePath);
// 将图片格式转为PixelMap
chooseImage = await imageSource.createPixelMap();
if (!chooseImage) {
return;
}
// 初始化OCR服务
const initResult = await textRecognition.init();
if (initResult) {
hilog.info(0x0000, 'textRecognitionSample', 'OCR service initialized successfully');
let visionInfo: textRecognition.VisionInfo = {
pixelMap: chooseImage
};
textRecognition.recognizeText(visionInfo,
(error: BusinessError, data: textRecognition.TextRecognitionResult) => {
if (error.code !== 0) {
hilog.error(0x0000, 'OCRDemo', `Failed to recognize text. Code: ${error.code}, message: ${error.message}`);
return;
}
// 识别成功,获取对应的结果
let recognitionString = JSON.stringify(data.value);
this.imageText = recognitionString
hilog.info(0x0000, 'OCRDemo', `Succeeded in recognizing text: ${recognitionString}`);
if(chooseImage && imageSource) {
chooseImage.release();
imageSource.release();
}
});
textRecognition.getSupportedLanguages().then((data: Array<string>) => {
let languageString = data.join(', ');
hilog.info(0x0000, 'OCRDemo', `Succeeded in obtaining the language: ${languageString}`);
}, (err: BusinessError) => {
hilog.error(0x0000, 'OCRDemo', `Failed to obtain the language. Code: ${err.code}, message: ${err.message}`);
});
// 使用完毕后,释放OCR服务
await textRecognition.release();
hilog.info(0x0000, 'textRecognitionSample', 'OCR service released successfully');
} else {
hilog.error(0x0000, 'textRecognitionSample', 'Failed to initialize OCR service');
}
if (fileSource) {
try {
await fileIo.close(fileSource);
} catch (err) {
hilog.error(0x0000, 'OCRDemo', `Failed to close fileSource. Code: ${err.code},message: ${err.message}`);
}
}
}, 100)
})
.margin({bottom:60})
Text(this.imageText)
.fontSize(20)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
【背景知识】
待识别的视觉信息,目前仅支持颜色数据格式为RGBA_8888的PixelMap类型的视觉信息。
被识别的图片约束与限制为:
- 支持的图片格式:JPEG、JPG、PNG。
- 支持的语言:简体中文、英文、日文、韩文、繁体中文。
- 文本长度:不超过10000字符。
- 支持文档印刷体识别,在识别手写字体方面能力有所欠缺。
- 输入图像具有合适成像的质量(建议720p以上),100px<高度<15210px,100px<宽度<10000px,高宽比例建议10:1以下(高度小于宽度的10倍),接近手机屏幕高宽比例为宜。
- 拍摄角度与文本所在平面垂直方向的夹角应小于30度。
更多关于HarmonyOS鸿蒙Next中使用OCR如何识别从沙箱读取的图片?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,使用OCR识别沙箱图片需通过picker选择图片并获取临时URI。调用image.createImageSource创建ImageSource实例,传入沙箱文件URI。使用image.createPixelMap解码为PixelMap对象,将其传入OCR引擎的detect方法执行识别。识别结果以文本形式返回。注意处理沙箱文件访问权限,确保URI有效。
在HarmonyOS Next中,通过OCR识别沙箱图片需使用@ohos.file.securityLabel和@ohos.ai.ocr模块。具体步骤:
- 使用
securityLabel.getSecurityLabel()获取沙箱图片的SecurityLabel ID - 通过
fileIo.open()和SecurityLabel ID读取图片文件 - 将图片数据转换为
image.PixelMap格式 - 调用
ocr.createTextDetector()创建识别器 - 使用
detect()方法进行OCR识别
关键代码示例:
import securityLabel from '@ohos.file.securityLabel';
import ocr from '@ohos.ai.ocr';
// 获取图片SecurityLabel
let securityLabelId = securityLabel.getSecurityLabel('/path/to/sandbox/image.jpg');
// 读取图片并转换为PixelMap
let file = fileIo.openSync(securityLabelId, fileIo.OpenMode.READ_ONLY);
let imageSource = image.createImageSource(file.fd);
let pixelMap = await imageSource.createPixelMap();
// 执行OCR识别
let textDetector = ocr.createTextDetector();
let result = await textDetector.detect(pixelMap);
注意:需要申请ohos.permission.READ_IMAGEVIDEO和ohos.permission.MEDIA_LOCATION权限。

