云開發(fā) 圖像處理

2020-07-21 17:55 更新

一、二維碼qrcode

在移動互聯(lián)網(wǎng)時代,二維碼是一個非常重要的入口,有時候我們需要將一些文本、網(wǎng)址乃至文件、圖片、名片等信息放置到一個小小的二維碼里,讓用戶可以通過手機掃碼的方式來獲取傳遞的信息。云函數(shù)也可以借助于第三方模塊,比如node-qrcode來創(chuàng)建二維碼。

技術(shù)文檔:node-qrcode Github地址

使用開發(fā)者工具,創(chuàng)建一個云函數(shù),如qrcode,然后在package.json增加qrcode最新版latest的依賴并用npm install安裝:

  1. "dependencies": {
  2. "qrcode": "latest"
  3. }

然后再在index.js輸入如下代碼,這里會先將創(chuàng)建的二維碼寫入到臨時文件夾,然后再用fs.createReadStream方法讀取圖片,上傳到云存儲,還是以云存儲為過渡,實現(xiàn)文件由服務(wù)端到小程序端的一個操作。

  1. const cloud = require('wx-server-sdk')
  2. const fs = require('fs')
  3. const QRCode = require('qrcode')
  4. cloud.init({
  5. env: cloud.DYNAMIC_CURRENT_ENV
  6. })
  7. exports.main = async (event, context) => {
  8. //text為二維碼里包含的內(nèi)容,將創(chuàng)建的二維碼圖片先存儲到/tmp臨時文件夾里,命名為qrcode.png
  9. const text="二維碼里的有騰訊云云開發(fā)"
  10. await QRCode.toFile('/tmp/qrcode.png',text, {
  11. color: {
  12. dark: '#00F', // 藍點
  13. ight: '#0000' // 透明底
  14. }
  15. }, function (err) {
  16. if (err) throw err
  17. console.log('done')
  18. })
  19. //讀取存儲到/tmp臨時文件夾里的二維碼圖片并上傳到云存儲里,返回fileID到小程序端
  20. const fileStream = await fs.createReadStream('/tmp/qrcode.png')
  21. return await cloud.uploadFile({
  22. cloudPath: 'qrcode.jpg',
  23. fileContent: fileStream,
  24. })
  25. }

執(zhí)行云函數(shù)之后就能在云存儲里看到我們生成的二維碼圖片qrcode.jpg了。如果想要深度定制更加符合你要求的二維碼,可以去翻閱上面給的技術(shù)文檔鏈接。

二、Sharp高速圖像處理庫

sharp是一個高速圖像處理庫,可以很方便的實現(xiàn)圖片編輯操作,如裁剪、格式轉(zhuǎn)換、旋轉(zhuǎn)變換、濾鏡添加、圖片合成(如添加水印)、圖片拼接等,支持JPEG, PNG, WebP, TIFF, GIF 和 SVG格式。在云函數(shù)端使用sharp來處理圖片,而云存儲則可以作為服務(wù)端和小程序端來傳遞圖片的橋梁。

由于圖片處理是一件非常消耗性能的事情,不僅會對云函數(shù)的內(nèi)存有要求,也可能會造成云函數(shù)的超時,以下只是研究使用云函數(shù)來處理圖片的可行性,大家在實際開發(fā)中不要這么處理,建議使用云開發(fā)的拓展能力來對圖像進行處理,功能更加強大(在后面的章節(jié)里,我們會介紹)。

技術(shù)文檔:sharp官方技術(shù)文檔

使用開發(fā)者工具,創(chuàng)建一個云函數(shù),如sharp,然后在package.json增加node-qrcode最新版latest的依賴,并右鍵云函數(shù)目錄選擇在終端中打開輸入命令npm install安裝依賴:

  1. "dependencies": {
  2. "sharp": "latest"
  3. }

然后再在index.js輸入如下代碼,這里我們假定圖片來源是云存儲,我們需要先下載圖片,然后用sharp對圖片進行處理,處理完之后再把圖片傳回云存儲。

  1. const cloud = require('wx-server-sdk')
  2. const fs = require('fs')
  3. const path = require('path')
  4. cloud.init({
  5. env: cloud.DYNAMIC_CURRENT_ENV,
  6. })
  7. const sharp = require('sharp');
  8. exports.main = async (event, context) => {
  9. //這里換成自己的fileID,也可以在小程序端上傳文件之后,把fileID傳進來event.fileID
  10. const fileID = 'cloud://xly-xrlur.786c-xly-xrlur-1300446086/1572315793628-366.png'
  11. //要用云函數(shù)處理圖片,需要先下載圖片,返回的圖片類型為Buffer
  12. const res = await cloud.downloadFile({
  13. fileID: fileID,
  14. })
  15. const buffer = res.fileContent
  16. //sharp對圖片進行處理之后,保存為output.png,也可以直接保存為Buffer
  17. await sharp(buffer).rotate().resize(200).toFile('output.png')
  18. // 云函數(shù)讀取模塊目錄下的圖片,并上傳到云存儲
  19. const fileStream = await fs.createReadStream(path.join(__dirname, 'output.png'))
  20. return await cloud.uploadFile({
  21. cloudPath: 'sharpdemo.jpg',
  22. fileContent: fileStream,
  23. })
  24. }

也可以讓sharp不需要先toFile轉(zhuǎn)成圖片,而是直接轉(zhuǎn)成Buffer,這樣就可以直接作為參數(shù)傳給fileContent上傳到云存儲,如:

  1. const buffer2 = await sharp(buffer).rotate().resize(200).toBuffer();
  2. return await cloud.uploadFile({
  3. cloudPath: 'sharpdemo2.jpg',
  4. fileContent: buffer2,
  5. })

需要說明的是sharp有一定的前置條件,Node.js 的版本需要是v10.13.0+,以及云函數(shù)所在的服務(wù)器配置了libvips binaries,目前云開發(fā)的云函數(shù)不太支持,未來云開發(fā)會升級Nodejs的版本。關(guān)于圖片處理的庫,我們也可以去Github awesome-nodejs 項目里去翻翻看有沒有其他合適的解決方案,不過更加推薦的是使用云開發(fā)的圖像處理拓展能力,更或者說強烈建議所有有圖片處理需求的用戶都應(yīng)該安裝圖像處理拓展能力

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號