API Đơn Giản Hỗ Trợ Chuyển Hình Ảnh Sang Văn Bản Bằng NodeJS

Hề… Lâu rồi mới viết lại một bài blog mới… Hôm nay là trung thu đấy, và bản thân thì chẳng biết làm gì ngoài việc chia sẽ với mọi người cách viết thử một API Đơn Giản Hỗ Trợ Chuyển Hình Ảnh Sang Văn Bản Bằng NodeJS! Game start….

1. Vậy API đó làm gì nào?

Đơn giản là khi mình gửi request có url một cái ảnh lên thì nó sẽ gửi lại một chuỗi, json hay gì gì đó… Miễn sao bạn sẽ biết được là trong ảnh đó có những chữ nào! À, mà mình dùng tesseract-js nha. Kiểu thế này nè: Mình có cái hình như thế này( Mới tải được ở trên mạng) :

Rồi khi mình gửi request bằng postman thì nó sẽ trả về chuỗi json như thế này:

sKiểu nó là như vậy đó, bạn đã hiểu hết mọi thứ mình sẽ làm chưa?

2. Vậy giờ làm gì nào?

_Mình đang lười, gặp lại sau nha… :v :v _ Update 02/10/2018

1. Viết hàm random tên ảnh ( ngẫu nhiên):

Đầu tiên thì mình nghĩ cần viết cái hàm đơn giản random về mấy cái tên theo kiểu “swqmexcgak.png” để chuẩn bị tư thế tải về local mà quét kiểm tra để OCR. Thôi thì cứ tạo một file tên là random_name.jsvậy.

1
2
3
4
5
6
7
8
9
10
11
12
13
function randomIntInc(low, high) {
return Math.floor(Math.random() \* (high - low + 1) + low)
}

function randomName(){
var name = '';
for(i = 0; i< 10; i++){
name+=String.fromCharCode(randomIntInc(97,122))
}
return name + '.png';
}

module.exports = randomName();

2. Tiếp theo là viết một cái file api.js có thể nhận về đường dẫn URL của ảnh từ post và tải về máy:

Cứ tạo file api.js thôi…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var express = require('express');
var router = express.Router();
var Tesseract = require('tesseract.js');
var request = require('request');
var fs = require('fs');
var randomName = require('../functions/random\_name.js');

var writeFile = fs.createWriteStream('imgs/' + randomName)

router.get('/', function (req, res) {
res.json({
msg: 'API is running...'
});
});

router.post('/', function (req, res) {
var img\_url = req.body.img\_url;
request(img\_url).pipe(writeFile).on('close', function() {
console.log(img\_url, 'saved to', randomName)
Tesseract.recognize('imgs/' + randomName,{lang: 'vie'})
.progress(function (p) { console.log('progress', p) })
.catch(err => console.error(err))
.then(function (result) {
console.log(result.text)
res.json({
text: result.text
});
})
})
});

module.exports = router;

Đoạn code hỗ trợ OCR nằm ở:

1
2
3
4
5
6
7
8
9
Tesseract.recognize('imgs/' + randomName,{lang: 'vie'})
.progress(function (p) { console.log('progress', p) })
.catch(err => console.error(err))
.then(function (result) {
console.log(result.text)
res.json({
text: result.text
});
})

Đây là cái đường dẫn ‘imgs/‘ + randomName đến ảnh mà bạn cần chuyển thành văn bản.

3. Cuối cùng là kết nối đống đó với nhau bằng nhiều cách, nhưng file app.js nó có thể như thế này:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
'use strict';
var express = require('express');
var bodyParser = require('body-parser');

var api = require('./routes/api');
var app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }))

app.use('/', api);
app.use('/api', api);

// Catch 404 and forward to error handler
app.use(function (req, res, next) {
res.status(404);
res.json({
error: 'Not found'
});
return;
});

// Error handlers
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.json({
error: err.message
});
return;
});

module.exports = app;

3. Kết bài:

Do mình lấy API từ một project của mình nên nó hơi mầu mè tý… Các bạn có thể xem project ở trên trang github của mình: https://github.com/huynhduckhoan/ocr-nodejs-api-example

Bài liên quan