最近用electron-vue(Electron :基於Chromium 和Node.js, 讓你可以使用HTML, CSS 和JavaScript 構建應用)擼了一個圖片壓縮的小軟體,平時工作還是需要用得到的,支援常用的圖片格式;
可以設定壓縮比例
1、支援設定固定寬高
2、支援固定寬或高(依原圖比例縮小)
3、支援等比例縮小
具體操作如下:
1、前端把圖片的路徑和保存壓縮後的路徑傳給後端,這個透過electron事件通訊就可以了
呼叫的是ipcRenderer.send事件,傳入一個事件名,後端用ipcRenderer.on接收即可,
這裡需要注意一下,我們使用ipcRenderer.once接收一次就可以,避免重複接收訊息。
具體參考如下程式碼:
await request('resize', this.form.imgPath , this.form.imgSavePath) request方法是对ipcRenderer.send做的一个封装 async function request( event = '', ...params) { if (!event) { return } // 构造promise const reply = new Promise((resolve, reject) => { // 数据返回事件,事先约定 const eventReply = `${event}-reply` ipcRenderer.once(eventReply, (event, data) => { resolve(data) }) }) // 触发事件 ipcRenderer.send(event, ...params) // 返回promise return reply }
2、後端剛開始考慮用image-size這個函式庫取得圖片的寬高;用法如下:只需要傳入圖片的路徑即可
const sizeOf = require('image-size') let dimensions = sizeOf(path) if(!dimensions){ return } let width = dimensions.width let height = dimensions.height
測試後發現了一點小問題,就是偶爾出現獲取失敗的情況,既然有問題那就不能使用了。後面經查詢用這個probe-image-size庫是沒有問題的,使用方式如下:
const probe = require('probe-image-size'); let dimensions = probe.sync(require('fs').readFileSync(path)) if(!dimensions){ return } let width = dimensions.width let height = dimensions.height
3、最後執行壓縮即可,傳入輸出圖片路徑和保存的寬高,調用resize-optimize -images這個函式庫,程式碼如下:
fs.readFile(path, function (err, originBuffer) { if (err) { return } output = output + `/${basename(path)}` fs.writeFile(output, originBuffer, async function (err) { if (err) { return } const options = { images: [output], width, height, quality: 95, } //执行压缩. await resizeOptimizeImages(options) }) })
總結:
#以上就是在使用image-size過程中碰到的一點小問題,雖然沒有從根源解決問題,但也能從中學習到一些東西,有時候想要達到自己想要的功能就不能固定使用一種方式,需要學會變通,更重要的是要學會分析問題和解決問題。
更多請關注php中文網其它相關文章!
以上是關於electron-vue圖片壓縮的詳細內容。更多資訊請關注PHP中文網其他相關文章!