HarmonyOS鸿蒙Next中使用OCR如何识别从沙箱读取的图片?

HarmonyOS鸿蒙Next中使用OCR如何识别从沙箱读取的图片? 使用OCR如何识别从沙箱读取的图片?

3 回复

开发者你好,参考以下方案:

【解决方案】

  1. 将本地图片存入沙箱,示例如下:

    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)
    
  2. 将存入沙箱的图片,转换为PixelMap格式,示例如下:

      imageSource = image.createImageSource(filePath);
      // 将图片格式转为PixelMap
      chooseImage = await imageSource.createPixelMap();
    
  3. 通过textRecognition.init初始化OCR服务。

  4. 识别图片,识别成功后获取到图片上的文字,示例如下:

    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类型的视觉信息。
被识别的图片约束与限制为:

  1. 支持的图片格式:JPEG、JPG、PNG。
  2. 支持的语言:简体中文、英文、日文、韩文、繁体中文。
  3. 文本长度:不超过10000字符。
  4. 支持文档印刷体识别,在识别手写字体方面能力有所欠缺。
  5. 输入图像具有合适成像的质量(建议720p以上),100px<高度<15210px,100px<宽度<10000px,高宽比例建议10:1以下(高度小于宽度的10倍),接近手机屏幕高宽比例为宜。
  6. 拍摄角度与文本所在平面垂直方向的夹角应小于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模块。具体步骤:

  1. 使用securityLabel.getSecurityLabel()获取沙箱图片的SecurityLabel ID
  2. 通过fileIo.open()和SecurityLabel ID读取图片文件
  3. 将图片数据转换为image.PixelMap格式
  4. 调用ocr.createTextDetector()创建识别器
  5. 使用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权限。

回到顶部