圖片壓縮工具 | 按指定高度垂直切割圖片

OPEN-IMAGE-TINY,一個基于 Electron + VUE3 的圖片壓縮工具,項目開源地址:https://github.com/0604hx/open-image-tiny

?? 需求描述

在上一篇文章一段代碼利用 snapdom 將 CSDN 博文轉化為長圖片(PNG/JPG/PDF)中,我截取到一張長圖,想要垂直切割成多張高度一致的小圖。雖然用美圖秀秀之類的軟件很快就能做到,奈何我覺得圖片壓縮工具也應該有這樣的一個功能,于是就有了這篇文章😄。

功能說明:

  • 只需要按設定的高度垂直切割
  • 最后一張小圖高度不足時填充指定顏色

🧑?💻 核心代碼

后端

//electron\tool.js
/*** @typedef {Object} SplitConfig - 切割配置* @property {Number} height - 高度* @property {Boolean} fit - 是否自動填充* @property {String} bgColor - 填充顏色** 垂直切割圖片** @param {String} origin - 原圖片* @param {SplitConfig} config - 配置*/
exports.splitImageVertical = async (origin, config)=>{const { width, height } = await this.readImgSize(origin)config.fit ??= trueconst ext = path.extname(origin)const count = Math.ceil(height / config.height)const outputDir = path.join(path.dirname(origin), `${path.basename(origin, ext)}-${config.height}px`)if(!existsSync(outputDir))mkdirSync(outputDir)const image = sharp(origin)let fileCount = 0let started = Date.now()for(let i=0;i<count;i++){const top = i * config.heightconst curHeight = Math.min(config.height, height - top)let chunk = image.clone().extract({ left:0, top, width, height: curHeight })//自動填充白色背景if(config.fit === true && config.height > curHeight){chunk = chunk.extend({ top:0, bottom: config.height - curHeight, left:0, right:0, background: config.bgColor||"#ffffff" })}let outFile = path.join(outputDir, `切割-${i+1}.${ext}`)await chunk.toFile(outFile)console.debug(`切割圖片 > ${outFile}`)fileCount ++}return { total:fileCount, dir: outputDir, used: Date.now() - started }
}

注冊 ipcMain 處理函數:

const handlers = {/**** @param {Electron.IpcMainInvokeEvent} e* @param {String} filePath* @param {import("./tool").SplitConfig} config* @returns {Object}*/'split': async (e, filePath, config)=> await splitImageVertical(filePath, config)
}

UI界面

<template><n-form :show-feedback="false" label-placement="left"><n-flex vertical><n-form-item label="切割高度"><n-input-number class="cell" :min="0" :step="50" v-model:value="config.height"><template #suffix><Tag>px</Tag></template></n-input-number></n-form-item><n-form-item label="自動填充"><n-switch v-model:value="config.fit" /></n-form-item><n-form-item v-if="config.fit==true" label="填充顏色"><n-color-picker v-model:value="config.bgColor" :show-alpha="false" /></n-form-item><n-button block type="primary" secondary :loading @click="toSplit">開始切割</n-button></n-flex></n-form>
</template><script setup>const props = defineProps({img:{ type:Object }})const config = reactive({ height:1000, fit:true, bgColor:"#ffffff" })const loading = ref(false)const toSplit=()=>{if(config.height >= props.img.height) return M.warn(`切割高度不能大于圖片原高度`)loading.value = trueH.action('split', props.img.path, toRaw(config)).then(v=>{loading.value = falselet { total, dir, used } = vM.dialog({maskClosable: false, showIcon: true,title: `切割完成`,content: `共生成 ${total} 張小圖,耗時 ${used} 毫秒。`,positiveText:"打開圖片文件夾",onPositiveClick: ()=>H.action('open', dir)})})}
</script>

🚀 界面實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

山東大學軟件學院創新項目實訓開發日志——第十七周(二)

目錄 1.優化前端日歷頁面顯示&#xff0c;增加鼠標懸停顯示當日會議基本信息的效果。 2.優化會議計劃生成與會議PPT生成功能&#xff0c;使得能夠加載多頁docx文件與PDF文件 3.優化了會議PPT生成功能&#xff0c;使得可以上傳多個文件并根據多個文件生成會議PPT 4.修改了識…

Ubuntu 使用kubeadm部署k8s系統組件反復重啟的問題

系統&#xff1a;Ubuntu 24.04 LTS 問題現象&#xff1a;kubeadm init 后系統組件proxy、apiserver、etcd等頻繁掛掉重啟 問題原因&#xff1a;cgroup配置問題 解決方法&#xff1a; 編輯系統cgroup默認配置文件 sudo nano /etc/default/grub 將GRUB_CMDLINE_LINUX_DEFAU…

Oracle獲取執行計劃之EXPLAIN PLAN 技術詳解

#Oracle #執行計劃 #EXPLAIN PLAN 一、引言 在Oracle數據庫性能優化中&#xff0c;?執行計劃&#xff08;Execution Plan&#xff09;?是理解SQL語句如何被數據庫處理的關鍵工具。EXPLAIN PLAN是Oracle提供的一種靜態分析SQL執行路徑的方法&#xff0c;它通過生成邏輯執行…

【論文閱讀】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模態大模型 多模態大模型MultiModal Large Language Models (MM-LLMs) 的發展可以通過一篇綜述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch區別

在 Vue 中&#xff0c;computed 和 watch 都是用來響應式地處理數據變化的工具&#xff0c;但它們的用途和行為有明顯區別。 &#x1f50d; 一句話總結 computed&#xff1a;用于聲明式計算屬性&#xff0c;有緩存。 watch&#xff1a;用于監聽響應式數據的變化并執行副作用邏…

大語言模型:提示詞決定自我反思效果: “檢查回答是否錯誤” “驗證回答是否正確”

大語言模型(LLMs)自我反思的結果很容易受提示詞構造的影響 大型語言模型(LLMs)展現出令人印象深刻的零樣本和少樣本推理能力。有人提出,這些能力可以通過自我反思來提升,即讓大型語言模型反思自己的輸出,以識別和糾正初始回答中的錯誤。然而,盡管有一些證據表明自我反…

【iReport】實際開發中,解決iReport中打印圖片不顯示問題

ireport 中增加圖片&#xff0c;添加上屬性&#xff0c;但是運行時報錯如下&#xff0c;是屬性logoPath沒有聲明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL進階】常用MySQL程序

目錄 一. mysqlcheck——表維護程序 1.1.作用 1.2 注意事項 1.3 使用方法 1.4 常用選項 1.5 mysqlcheck的特殊使用 二. mysqldump——數據庫備份程序 2.1.作用 2.2 注意事項 2.3 使用方法 2.4 常用選項 三. mysqladmin——MySQL 服務器管理程序 3.1.作用 3.2 使用…

EMQX高效存儲消息到MySQL指南

配置 EMQX 存儲消息到 MySQL EMQX 可以通過規則引擎和數據橋接功能將消息和事件存儲到 MySQL 數據庫。以下是具體實現方法&#xff1a; 創建 MySQL 數據表 在 MySQL 中創建用于存儲消息的表結構&#xff1a; CREATE TABLE mqtt_messages (id int(11) NOT NULL AUTO_INCREME…

springboot項目,利用docker打包部署

Windows WSL2 Docker Desktop 部署 SpringBoot 項目指南 &#xff08;沒有安裝docker的&#xff0c;如果是windows家庭中文版的&#xff0c;可以看我上一篇帖子&#xff1a;windows家庭版安裝docker和redis-CSDN博客&#xff09; 本教程將說明如何在 Windows 系統 下&#…

MO+內核32位普冉單片機PY32F003開發板

PY32F003開發板是基于普冉半導體PY32F003微控制器設計的低成本入門級開發工具&#xff0c; PY32F003系列微控制器采用高性能的 32 位ARM Cortex-M0內核&#xff0c;寬電壓工作范圍的 MCU。嵌入高達32Kbytes flash 和 4Kbytes SRAM 存儲器&#xff0c;最高工作頻率 32MHz。PY32…

MySql 用存儲過程刪除所有用戶表

用拼接語句總是會出問題 -- 1. 禁用外鍵約束&#xff08;防止級聯刪除失敗&#xff09;[1]() SET SESSION FOREIGN_KEY_CHECKS 0; -- 2. 生成并執行刪除語句&#xff08;替換 your_database_name&#xff09; SELECT CONCAT(DROP TABLE IF EXISTS , TABLE_NAME, ;) -- 預覽語…

Java八股文——MySQL「鎖篇」

講一下MySQL里有哪些鎖&#xff1f; 面試官您好&#xff0c;MySQL中的鎖機制非常豐富&#xff0c;它是保證數據一致性和并發安全的核心。我通常會從鎖的粒度&#xff08;加鎖范圍&#xff09; 和鎖的模式&#xff08;功能&#xff09; 這兩個維度來理解它們。 第一維度&#…

B站精品課程

【Python并發編程】線程&#xff0c;進程&#xff0c;協程&#xff0c;線程安全&#xff0c;多線程&#xff0c;死鎖&#xff0c;線程池等與案例解析&#xff0c;從入門到精通 https://www.bilibili.com/video/BV1EfdcYmEff/?spm_id_from333.337.search-card.all.click&v…

# ubuntu中安裝使用五筆輸入法

先 清理舊輸入法并重新安裝 fcitx5 五筆輸入法&#x1f447; &#x1f4e6; 第一步&#xff1a;清理舊的 Fcitx5 及相關輸入法組件 sudo apt purge fcitx* mozc* ibus* -y sudo apt autoremove --purge -y&#x1f4dd; 說明&#xff1a; fcitx* 會清除舊版本 Fcitx/Fcitx5。…

LSM樹與B+樹優缺點分析

1. LSM樹優化了順序寫&#xff0c;因此寫性能很好&#xff0c;但在查詢上&#xff1a; 需要從Level 0到Level n一直順序查下去。極端情況是LSM樹中不存在該數據&#xff0c;則需要遍歷L0->Ln&#xff0c;最后返回空集。 解決方法是用布隆過濾器優化查詢。 2. B樹范圍查詢性…

【成都魚住未來身份證】 身份證讀取與解析———未來之窗行業應用跨平臺架構——智能編程——仙盟創夢IDE

讀取身份證開發配置 function readerid魚住未來科技(){const webUrl http:// "127.0.0.1:30004" /api/info$.ajax({url: webUrl,type: GET,dataType: json,success: function (result) {// processContent.text(web api接口&#xff1a; webUrl 讀取身份證信息…

開啟并連接redis以及端口占用問題

開啟命令行 redis-server.exe redis.windows.conf 端口占用問題 查看端口&#xff1a; 輸入命令行&#xff1a; netstat -ano | findstr :6379 找到并停止pid號&#xff1a; 這個要用到cmd管理員身份打開 taskkill /f /pid 你的端口號 重新開啟就行了 再用另一個cmd進行連…

MCP數據可視化服務器配置依賴

# requirements.txt # MCP數據可視化服務器依賴包# 核心MCP包 mcp>=0.1.0# 數據處理 pandas>=2.0.0 numpy>=1.24.0# 可視化 matplotlib>=3.7.0 seaborn>=0.12.0# 異步支持 asyncio-mqtt>=0.13.0# JSON處理 jsonschema>=4.17.0# 圖像處理 Pillow>=9.5.0…

量化面試綠皮書:14. 鐘表零件

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 14. 鐘表零件 一個時鐘(順時針編號為 1-12)從墻上掉了下來&#xff0c;摔成三塊你發現每塊上的數字之和是相等的。 Q: 每塊上的數字是多少&…