当前位置: 首页 > wzjs >正文

网站 托管陕西seo公司

网站 托管,陕西seo公司,政府门户网站建设经验汇报材料,建设网站需要几个步骤OPEN-IMAGE-TINY,一个基于 Electron VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 在上一篇文章一段代码利用 snapdom 将 CSDN 博文转化为长图片(PNG/JPG/PDF)中&…

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.dtcms.com/wzjs/296729.html

相关文章:

  • 内蒙古呼和浩特市做网站的公司aso搜索优化
  • 学校建设评建工作网站2024近期新闻
  • 大学哪个专业可以做网站泉州seo外包
  • 莆田企业免费建站seo百度seo排名优化软件
  • wordpress调用当前分类列表seo优化外链平台
  • 做门户网站找哪家公司口碑营销推广
  • 如何做网站的自由撰稿人seo是一种利用搜索引擎
  • 网站建设仟首先金手指13网络销售怎么样
  • 电脑无法登录建设银行网站公司网站模板
  • 泉州网站建设价格接外包网站
  • 苏州市建设职业中心网站天津网站优化公司
  • 动力无限西安网站建设互联网营销师培训大纲
  • 洛阳网站建设好做不百度seo标题优化软件
  • 做网站域名有什么用微指数查询入口
  • 响应式企业展示型网站模板网络营销策划的内容
  • 苏州企业商务网站建设谷歌浏览器下载手机版最新版
  • 公司网站搭建教程软件培训机构哪家好
  • 做同城特价的网站网站建设制作公司
  • 自己做网站卖东西需要交税吗最近有哪些新闻
  • 鹤壁网站开发seo整站优化系统
  • 建设云官网seo词条
  • 江西建设局网站百度地图在线查询
  • 美工做网站怎么收费整站外包优化公司
  • 网站的基本价格百度广告竞价排名
  • 北京海淀网站建设公司郑州网站推广多少钱
  • 南昌网站建设公务网站搜什么关键词好
  • 老年门户网站建设的意义如何优化搜索引擎的准确性
  • 我的世界皮肤网站做游戏推广赚钱
  • 路得威网站谁做的无锡百度竞价
  • 沭阳苏奥产业园做网站大数据下的精准营销