一、NodeCanvas暫停
NodeCanvas是一個基於node.js的canvas庫,可以使用JavaScript生成圖形,支持多種繪圖操作,像素操作,圖像濾鏡,字體處理,圖像剪裁,圖像合成,PDF輸出等等功能。NodeCanvas提供了一種靈活的方式將canvas應用於伺服器端。
然而,由於NodeCanvas是一個基於C++實現的插件,會存在部分API產生內存泄漏等問題。目前,NodeCanvas已經停止繼續開發了。但是,有些互聯網公司出於自身業務問題,仍在使用NodeCanvas。 而開發者們仍可以自行按照NodeCanvas實現原理,學習學習底層實現的方法。
二、NodeCanvasAPI
NodeCanvas提供了一套基本的API來操作canvas。這些API大部分類 態都是直接使用純JavaScript調用,極其靈活。如果你曾經使用過前端 HTML5中的canvas,那麼使用NodeCanvas去寫伺服器端 繪圖代碼將會變得非常簡單。
以下是一些NodeCanvas常用的API:
// 創建一個新的canvas對象
const { createCanvas } = require('canvas');
const canvas = createCanvas(200, 200);
// 通過繪製矩形來填充一個區域的顏色
const ctx = canvas.getContext('2d');
ctx.fillRect(0, 0, 100, 200);
// 向canvas中渲染text
ctx.font = '30px Impact';
ctx.rotate(0.1);
ctx.fillText('Hello World!', 50, 100);
// 創建一個png編碼的Buffer,將圖像寫入到文件中的方法
const fs = require('fs');
const out = fs.createWriteStream(__dirname + '/text.png');
const stream = canvas.createPNGStream();
stream.pipe(out);
out.on('finish', () => console.log('The PNG file was created.'));三、NodeCanvas實戰案例
1. 生成二維碼圖片
使用NodeCanvas,可以很容易地生成二維碼圖片。
const { createCanvas } = require('canvas');
const QRCode = require('qrcode');
const canvas = createCanvas(200, 200);
const ctx = canvas.getContext('2d');
QRCode.toCanvas(canvas, 'https://www.example.com', (error) => {
if (error) {
console.error(error)
return
}
console.log('success!');
});
console.log('');2. 智能圖像識別
使用NodeCanvas可以使用機器學習 AI技術,幫助我們實現智能圖像識別功能。下面通過一個實例代碼來了解這個過程:
// 使用tensorflow.js庫來對圖像進行classification
const sharp = require('sharp');
const tf = require('@tensorflow/tfjs');
const { createCanvas, Image } = require('canvas');
// 將圖像載入到一個ImageData對象中
sharp('image.jpg')
.resize(224, 224)
.toBuffer()
.then(data => {
const img = new Image();
img.onload = async () => {
// 將圖像轉換為Tensor並進行預測
const tensor = tf.browser.fromPixels(img).expandDims();
const predictions = await model.predict(tensor).data();
// 按照順序選擇最大預測概率
const classes = ['cat', 'dog', 'bird'];
const res = Array.from(predictions)
.map((p, i) => ({ probability: p, className: classes[i] }))
.sort((a, b) => b.probability - a.probability)
.slice(0, 2);
console.log(res); // 輸出最大概率的兩個類別
};
img.onerror = err => { throw err; };
img.src = data;
});
3. 手寫數字識別
// 使用TensorFlow.js進行手寫數字識別
const fs = require('fs');
const { createCanvas, Image } = require('canvas');
const tf = require('@tensorflow/tfjs');
(async () => {
const model = await tf.loadLayersModel('file://path/to/model.json');
const canvas = createCanvas(28, 28);
const input = tf.browser.fromPixels(canvas).reshape([784]);
// 繪製手寫數字
const ctx = canvas.getContext('2d');
ctx.strokeStyle = '#fff';
ctx.lineWidth = 3;
ctx.strokeRect(0, 0, 28, 28);
ctx.lineWidth = 1;
const _onmousedown = (e) => {
ctx.beginPath();
ctx.moveTo(e.offsetX, e.offsetY);
canvas.addEventListener('mousemove', _onmousemove);
};
const _onmousemove = (e) => {
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
};
const _onmouseup = (e) => {
canvas.removeEventListener('mousemove', _onmousemove);
// 將手寫數字轉換為Tensor並進行預測
const input = tf.browser.fromPixels(canvas).reshape([784]);
const output = model.predict(input.expandDims(0));
const prediction = Array.from(await output.data());
console.log(prediction.indexOf(Math.max(...prediction))); // 輸出預測結果
};
canvas.addEventListener('mousedown', _onmousedown);
canvas.addEventListener('mouseup', _onmouseup);
})();總結
NodeCanvas雖然已經停息維護,但是,對於有其他業務需求的開發者來說,使用NodeCanvas仍是一個不錯的選擇。只要我們按照其API進行操作,就可以輕鬆地實現伺服器端的圖像處理,甚至是AI其他相關功能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186686.html
微信掃一掃
支付寶掃一掃