网站首页 > 技术文章 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 jscanify
Open-source pure Javascript implemented mobile document scanner. Powered with opencv.js. Supports the web, NodeJS, React, and others.
jscanify 是开源的纯 Javascript 实现的移动文档扫描仪,由 opencv.js 提供支持,支持: Web、NodeJS、React 等环境。
jscanify 的典型特征包括:
- 纸张检测和突出显示
- 带畸变校正的纸张扫描
目前 jscanify 在 Github 通过 MIT 协议开源,有超过 1k 的 star,是一个值得关注的前端开源项目。
如何使用 jscanify
首先导入相应的库:
$ npm i jscanify
// 安装 jscanify 然后导入
import jscanify from 'jscanify'
使用起来也非常简单:
const scanner = new jscanify();
// image的onload触发后可以调用方法
image.onload = function () {
const highlightedCanvas = scanner.highlightPaper(image);
document.body.appendChild(highlightedCanvas);
};
以上 image 元素表示图片对象,即 <img src="/path/to/your/image.png" id="image" />。
当然,jscanify 还支持在用户相机中突出显示纸张。以下代码不断从用户的相机读取数据并突出显示纸张:
<video id="video"></video>
<canvas id="canvas"></canvas>
// 原始视频
<canvas id="result"></canvas>
// 高亮后的视频
以下是利用 navigator.mediaDevices.getUserMedia 获取用户摄像头数据的示例:
const scanner = new jscanify();
const canvasCtx = canvas.getContext("2d");
const resultCtx = result.getContext("2d");
navigator.mediaDevices.getUserMedia({video: true}).then((stream) => {
video.srcObject = stream;
video.onloadedmetadata = () => {
video.play();
setInterval(() => {
canvasCtx.drawImage(video, 0, 0);
const resultCanvas = scanner.highlightPaper(canvas);
resultCtx.drawImage(resultCanvas, 0, 0);
}, 10);
};
});
当然,开发者还可以通过利用 jsPDF 库和 toDataURL 函数来实现导出为 PDF 的目的。
download.addEventListener("click", function() {
// jsPDF 只支持 jpeg
var imgData = canvas.toDataURL("image/jpeg", 1.0);
var pdf = new jsPDF();
pdf.addImage(imgData, 'JPEG', 0, 0);
pdf.save("download.pdf");
}, false);
更多关于 jscanify 的用法和示例可以参考文末资料,本文不再过多展开.
参考资料
https://github.com/ColonelParrot/jscanify
https://colonelparrot.github.io/jscanify/
https://stackoverflow.com/questions/23681325/convert-canvas-to-pdf
- 上一篇: js事件机制详解
- 下一篇: H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格
猜你喜欢
- 2025-01-02 JavaScript字符串toString()方法教程
- 2025-01-02 vue3 - 内置组件Teleport的使用
- 2025-01-02 网页三维CAD中加载和保存STEP模型
- 2025-01-02 在.NET Web API中设置响应输出Json数据格式的两种常用方式
- 2025-01-02 剖析Selenium代码执行时元素查找失败的缘由
- 2025-01-02 H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格
- 2025-01-02 js事件机制详解
- 2025-01-02 Java ArrayList用法详解附代码示例
- 2025-01-02 如何用枚举快速提高编程效率,数据元素快速对应,小枚举大作用
- 2025-01-02 这段代码,还有优化的地方吗?
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)