什么!纯前端也能识别图片中的文案、还支持100多个国家的语言

在传统认知中,文字识别(OCR)通常需要后端服务器的支持,但现代前端技术已经突破了这个限制。本文将介绍如何使用纯前端JavaScript库Tesseract.js实现强大的OCR功能,直接在浏览器中识别图片中的文字,并支持100多种语言。

什么是Tesseract.js?

Tesseract.js是流行的开源OCR引擎Tesseract的JavaScript版本,它允许开发者直接在浏览器或Node.js环境中执行文字识别任务,无需依赖其他后端服务。Tesseract.js 还具备以下特点:

纯前端实现: 所有处理都在浏览器中完成,保护用户隐私

多语言支持: 可识别100多种语言的文字

高性能: 利用WebAssembly加速处理速度

易用性: 简单的API接口,快速集成到项目中

一、 首先创建一个vue项目和安装相关依赖

pnpm create vite vue3-tesseractjs

cd vue3-tesseractjs

pnpm install

pnpm run dev

二、 安装tesseract.js

pnpm install tesseract.js

三、 编写识别图片中文案的代码

js 复制代码
<template>
  <div>识别出的文案: {{ text }}</div>
</template>

<script setup>
import { ref } from "vue";
import { createWorker } from "tesseract.js";
import img from "./assets/images/china-text.png";

const text = ref("");
(async () => {
  const worker = await createWorker("chi_sim"); //  语言标识 chi_sim 代表简体中文
  const ret = await worker.recognize(img); // 添加识别图片图片的路径
  console.log(ret.data.text); // 打印识别文案的结果
  text.value = ret.data.text; // 将识别的结果显示到页面上
  await worker.terminate(); // 在确定不再需要 Worker 时立即调用 terminate()
})();
</script>

<style scoped></style>

识别结果:

这是原图片

可以看到使用tesseract.js 实现识别图片中的文案非常简单:

  • 导入tesseract.js
  • 创建worker 并传入语言标识
  • 使用recognize 方法添加需要识别的图片路径,并通过该方法的返回值的到结果
  • 我们需要的识别出来的文案在recognize 返回出来的结果的data属性的text属性上
  • 通过terminate 方法停止worker 以节省内存和性能消耗,再确认后面没有其他的识别的时候调用该方法

四、适配多个国家的语言

第一种写法数组写法:

js 复制代码
const worker = await createWorker(["eng", "chi_sim"]); //  一段文案中可能有英文和中文两种语言的情况

第二种写法,字符串写法:

js 复制代码
const worker = await createWorker("eng+chi_sim"); //  一段文案中可能有英文和中文两种语言的情况

语言标识可以查看官方文档: tesseract-ocr.github.io/tessdoc/Dat... 这里列出了可以识别的100多个国家的语言标识

五、添加识别的进度条

js 复制代码
<template>
  <div class="wraper">
    <ElButton @click="imgToText" type="primary">开始识别</ElButton>
    <div class="text-wraper">识别出的文案: {{ text }}</div>
    <ElProgress
      :text-inside="true"
      :stroke-width="26"
      :percentage="percentage"
    ></ElProgress>
  </div>
</template>

<script setup>
import { ref } from "vue";
import { createWorker } from "tesseract.js";
import img from "./assets/images/china-text.png";
import { ElProgress, ElButton } from "element-plus";
import "element-plus/es/components/progress/style/css";
import "element-plus/es/components/button/style/css";

const text = ref("");
const percentage = ref(0);
const imgToText = async () => {
  const worker = await createWorker("eng+chi_sim", 1, {
    logger: (m) => {
      console.log(m);
      if (m.status === "recognizing text") {
        percentage.value = parseInt(m.progress * 100);
      }
    },
  }); //  一段文案中可能有英文和中文两种语言的情况
  const ret = await worker.recognize(img); // 添加识别图片图片的路径
  console.log(ret.data); // 打印识别文案的结果
  text.value = ret.data.text; // 将识别的结果显示到页面上
  await worker.terminate(); // 在确定不再需要 Worker 时立即调用 terminate()
};
</script>

<style scoped>
.wraper {
  min-width: 800px;
}
.text-wraper {
  padding: 60px 0;
}
</style>

运行效果:

由上面可以看出:

  • 实现识别进度条功能主要通过createWorker 的第三个参数的logger 函数来实现的,logger的参数中m.progress 代表了进度的多少,但是需要注意的是先先要判断下状态为recognizing text, 否则的话你会看到进度条先变成100%, 再从0%到100%.
  • 这里进度条的实现运用了element-plus,所以需要先执行pnpm install element-plus
  • 为了看效果,将之前的立即执行改成了点击后执行

六、添加input, type="file" 选择文件(优化)

细心的同学可能会发现一个问题我们之前的代码是将图片写死的,真实项目中肯定是不能这样的,一般都是选择文件来识别。所以我们这里来添加下选择文件识别。具体代码如下:

js 复制代码
<template>
  <div class="wraper">
    <input @change="imgToText" type="file" />
    <div class="text-wraper">识别出的文案: {{ text }}</div>
    <ElProgress
      :text-inside="true"
      :stroke-width="26"
      :percentage="percentage"
    ></ElProgress>
  </div>
</template>

<script setup>
import { ref } from "vue";
import { createWorker } from "tesseract.js";
import { ElProgress } from "element-plus";
import "element-plus/es/components/progress/style/css";

const text = ref("");
const percentage = ref(0);
const imgToText = async (e) => {
  const worker = await createWorker("eng+chi_sim", 1, {
    logger: (m) => {
      console.log(m);
      if (m.status === "recognizing text") {
        percentage.value = parseInt(m.progress * 100);
      }
    },
  }); //  一段文案中可能有英文和中文两种语言的情况
  console.log(e, "--e");
  const ret = await worker.recognize(e.target.files[0]); // 添加识别图片图片的路径
  console.log(ret.data); // 打印识别文案的结果
  text.value = ret.data.text; // 将识别的结果显示到页面上
  await worker.terminate(); // 在确定不再需要 Worker 时立即调用 terminate()
};
</script>

<style scoped>
.wraper {
  min-width: 800px;
}
.text-wraper {
  padding: 60px 0;
}
</style>

主要有三个点:

  • 将之前的我ElButton改成了input标签且type="file"
  • 将之前的写死的图片改成了e.target.files[0]

来看运行效果:

七、总结

本篇主要分享了使用Tesseract.js 库实现图片中的文案,包括以下极大核心:

  • 如何处理一张图片中同时有多个语言的情况
  • 如何添加识别进度条
  • 将写死的图片改成可以选择的图片

本篇就分享到这里了,感谢收看

相关推荐
崔庆才丨静觅5 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅1 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊2 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax