写一个可以批量修改图片分辨率的工具

说在前面

🎈在视觉内容至关重要的今天,图片尺寸的调整对于网站加载速度和用户体验有着直接影响。本文介绍的Node.js工具,通过简单的命令行操作,允许用户批量调整图片尺寸,支持单张图片和整个目录的操作,提供了按比例缩放和自定义宽高的灵活选项。这不仅提高了工作效率,也使得图片管理变得更加简单。

代码实现

1.依赖引入

(1)@jyeontu/j-inquirer

@jyeontu/j-inquirer 是一个 Node.js 的命令行交互模块,它可以方便地创建一个交互式命令行界面,用于与用户进行交互。它提供了多种常见的输入方式,如单选、多选、输入框、文件选择、目录选择等等,并且可以自定义提示信息、选项等。

(2)@jyeontu/progress-bar

@jyeontu/progress-bar 是一个 Node.js 的进度条模块,它可以在命令行中展示一个进度条,用于显示正在进行的操作的进度。它支持多种样式和配置选项,可以根据需要调整进度条的样式、长度、颜色等等。

(3)fs-extra

扩展了Node.js的fs模块,它提供了多种操作文件和目录的方法,如读取文件、写入文件、创建目录、删除文件等等。在 Node.js 中,我们可以使用 fs-extra 模块来读取和处理本地的文件。

(4)jimp

jimp 是一个纯 JavaScript 的图像处理库,它可以用于处理各种类型的图片,如 PNG、JPEG、BMP 等等。它提供了多种图像处理方法,如调整大小、裁剪、旋转、添加水印等等,可以轻松地实现各种图像处理需求。在 Node.js 中,我们可以使用 jimp 来读取和处理本地的图片文件。

2.命令行交互获取处理参数

(1)单张图片或批量

询问用户是要处理单个图片还是一个图片文件夹

async function askForSingleOrBatch() {
  const options = [
    {
      type: "list",
      message: "选择文件夹还是单张图片",
      name: "imgType",
      default: "单张图片",
      choices: ["文件夹", "单张图片"],
    },
  ];
  const answers = await new inquirer(options).prompt();
  const { imgType } = answers;
  return imgType;
}
(2)获取图片路径

根据用户选择的类型(单个图片或文件夹),询问用户选择图片或文件夹的路径,并询问调整尺寸的方式。

async function askForParams(imgType) {
  const options = [];
  if (imgType === "文件夹") {
    options.push({
      type: "folder",
      message: "请选择图片目录",
      name: "imgFolder",
      default: "",
      dirname: baseDir,
    });
  } else {
    options.push({
      type: "file",
      message: "请选择图片",
      name: "img",
      default: "",
      dirname: baseDir,
    });
  }
  options.push({
    type: "list",
    message: "调整类型",
    name: "adjustType",
    default: "按比例",
    choices: ["按比例", "自定义宽高"],
  });
  const answers = await new inquirer(options).prompt();
  return answers;
}
(3)获取具体调整参数

根据用户选择的调整方式,询问用户具体的调整参数。

async function askForImgParams(adjustType) {
  const options = [];
  if (adjustType === "按比例") {
    options.push(
      {
        type: "list",
        message: "请选择基准边",
        name: "referenceEdge",
        default: "宽",
        choices: ["宽", "高"],
      },
      {
        type: "input",
        message: "请输入基准边长度",
        name: "referenceEdgeLength",
        default: "800",
        validate: function (input) {
          const isNumber = !isNaN(input) && !isNaN(parseFloat(input));
          if (isNumber) {
            return true; // 输入有效
          } else {
            return "请输入一个有效的数字"; // 输入无效
          }
        },
      }
    );
  } else {
    options.push(
      {
        type: "input",
        message: "请输入宽度",
        name: "width",
        default: "1280",
        validate: function (input) {
          const isNumber = !isNaN(input) && !isNaN(parseFloat(input));
          if (isNumber) {
            return true; // 输入有效
          } else {
            return "请输入一个有效的数字"; // 输入无效
          }
        },
      },
      {
        type: "input",
        message: "请输入高度",
        name: "height",
        default: "720",
        validate: function (input) {
          const isNumber = !isNaN(input) && !isNaN(parseFloat(input));
          if (isNumber) {
            return true; // 输入有效
          } else {
            return "请输入一个有效的数字"; // 输入无效
          }
        },
      }
    );
  }
  const answers = await new inquirer(options).prompt();
  return answers;
}

3.计算调整后图片分辨率

根据用户输入的参数,计算出调整后的图片宽度和高度。

function getWidthAndHeight(bitmap, params) {
  let { width, height } = bitmap;
  if (params.adjustType === "按比例") {
    if (params.referenceEdge === "宽") {
      const rate = params.referenceEdgeLength / width;
      width = params.referenceEdgeLength;
      height = height * rate;
    } else {
      const rate = params.referenceEdgeLength / height;
      height = params.referenceEdgeLength;
      width = width * rate;
    }
  } else {
    width = params.width;
    height = params.height;
  }
  width -= 0;
  height -= 0;
  return { width, height };
}
参数解释:
  • bitmap:这是一个Jimp对象,代表了加载的图片,包含了图片的原始宽度和高度信息。
  • params:这是一个对象,包含了用户通过命令行交互指定的调整参数,主要有:
    • adjustType:用户选择的调整类型,可以是"按比例"或"自定义宽高"。
    • referenceEdge:如果用户选择按比例调整,这个属性指定了参考边是"宽"还是"高"。
    • referenceEdgeLength:用户输入的基准边长度。
    • widthheight:如果用户选择自定义宽高,这两个属性会包含用户输入的宽度和高度值。
函数逻辑:
  1. 函数首先从bitmap对象中解构出原始的width(宽度)和height(高度)。

  2. 接下来,根据params.adjustType的值来判断用户选择的调整类型:

    • 如果是"按比例"("按比例"),则进一步检查params.referenceEdge的值:
      • 如果参考边是"宽"("宽"),则计算新的宽度为用户指定的基准边长度params.referenceEdgeLength,然后根据原始高度和新宽度的比例计算新的height
      • 如果参考边是"高"("高"),则计算新的height为用户指定的基准边长度,然后计算新的width
    • 如果用户选择的是"自定义宽高"(非"按比例"),则直接将用户指定的params.widthparams.height作为新的宽度和高度。
  3. 在计算出新的宽度和高度后,函数通过width -= 0;height -= 0;将数值转换为数字类型,以确保它们是数字而不是字符串。这是因为用户输入可能会被当作字符串处理,而在进行数学计算时需要确保它们是数字类型。

  4. 最后,函数返回一个包含新widthheight的对象。

注意:
  • 这个函数中的width -= 0;height -= 0;是一种类型转换的技巧,它利用了JavaScript的类型转换规则,将变量转换为数字类型。这种转换通常不是必须的,因为从bitmap对象中直接解构出来的widthheight应该已经是数字类型了。如果params.widthparams.height是从用户输入解析得到的,并且确定用户输入的是有效的数字,这两个转换语句可以省略。

4.获取修改后图片输出路径

根据用户选择的图片或文件夹路径,生成输出目录的路径,如果路径不存在则创建该目录。

async function getOutPutDir(img) {
  const pathName = img.split("\\");
  const name = pathName.pop();
  pathName.push("resizeImgOutPut");
  const outputPath = pathName.join("\\");
  if (!fs.existsSync(outputPath)) {
    fs.mkdirSync(outputPath);
  }
  pathName.push(name);
  return pathName.join("\\");
}

5.定义图片处理函数

(1)单张图片
async function resizeImg(params) {
  const outputPath = await getOutPutDir(params.img);
  const image = await Jimp.read(params.img);
  const { width, height } = getWidthAndHeight(image.bitmap, params);
  const newSizeImage = image.resize(width, height);
  newSizeImage.write(outputPath);
}
(2)图片目录
async function resizeDir(params) {
  const imgList = fs.readdirSync(params.imgFolder);
  for (let i = 0; i < imgList.length; i++) {
    if (imgList[i].match(/\.(jpg|jpeg|png|bmp|tiff|gif)$/i)) {
      await resizeImg({
        ...params,
        img: params.imgFolder + "\\" + imgList[i],
      });
    }
  }
}

快速使用

安装

该工具已经发布到npm上,可以在命令行快速安装:

npm install -g jyeontu

功能选择

jyeontu img

选择调整图片尺寸,然后按提示输入或选择即可。

源码

Gitee

该工具的源码也已经开源,有兴趣的同学可以到Gitee上查看:

https://gitee.com/changkong1009/node-scripting-tool/tree/master/src/jyeontu/script/img/resize

欢迎star~

欢迎pr~

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/729538.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM32开发--FreeRTOS-事件组

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 目标 内容 概念 事件标志位 开发流程 功能介绍 创建事件组 触发事件 等待事件触发 同步 清理事件 案例 总结 前言 在嵌入式系统开发中&#xff0c;任务之间的同步和通信是至关重要的…

从新手小白到红酒大咖:解锁红酒品鉴的终极秘籍,升级之路全攻略

在五彩斑斓的饮品世界中&#xff0c;红酒以其深邃的色泽、丰富的口感和悠久的历史&#xff0c;吸引了无数人的目光。对于红酒的初学者来说&#xff0c;从小白到品鉴师的道路或许充满了未知与挑战&#xff0c;但只要掌握了正确的知识和方法&#xff0c;就能够轻松踏入这个美妙的…

测试的基础知识大全【测试概念、分类、模型、流程、测试用例书写、用例设计、Bug、基础功能测试实战】

测试基础笔记 Day01阶段⽬标⼀、测试介绍⼆、测试常⽤分类2.1 阶段划分单元测试集成测试系统测试验收测试 2.2 代码可⻅度划分⿊盒测试&#xff1a;主要针对功能&#xff08;阶段划分->系统测试&#xff09;灰盒测试&#xff1a;针对接⼝测试&#xff08;阶段划分->集成测…

海思NNIE精度对比详细操作指南

海思NNIE部署推理经常会遇到精度下降问题,但是又摸不着头脑究竟是什么原因,因此需要做精度分析来排查是不是算子问题或者是具体哪个算子问题。本文撰写详细操作说明文档,具体可以参考资料:海思NNIE之Mobilefacenet量化部署-腾讯云开发者社区-腾讯云 1.打开日志等级 不知道…

OpenAI 联合创始人 Ilya Sutskever 的新初创公司致力于“安全超级智能”

OpenAI 前首席科学家伊利亚-苏茨克沃尔&#xff08;Ilya Sutskever&#xff09;在今年 5 月离开了他共同创立的人工智能研究公司后&#xff0c;透露了他的下一个重要项目。 相关阅读&#xff1a;GPT-4o通过整合文本、音频和视觉实现人性化的AI交互&#xff0c;OpenAI推出了其新…

STM32 I2C总线锁死原因及解决方法

本文介绍STM32 I2C总线锁死原因及解决方法。 在使用STM32 I2C总线操作外设时&#xff0c;有时会遇到I2C总线锁死&#xff08;I2C总线为Busy状态&#xff09;的问题&#xff0c;即便复位MCU也无法解决&#xff0c;本文介绍其锁死的原因和解决方法&#xff0c;并给出相应的参考代…

融资融券有哪些优势和风险,融资融券利息怎么算,利率最低是?4.0

融资融券的优势 1. 提高资金利用率&#xff1a;获得额外的资金或股票交易&#xff0c;提高资金利用率&#xff0c;扩大投资规模。 2. 降低投资风险&#xff1a;通过融资融券买入多只股票分散风险&#xff0c;降低单一股票持仓风险。 3. 增加投资收益&#xff1a;提供更多的交…

CVPR2024|UniPAD:一种自动驾驶的统一的预训练范式

本文章仅用于学术分享 论文标题丨 UniPAD: A Universal Pre-training Paradigm for Autonomous Driving 论文地址丨 https://arxiv.org/abs/2310.08370 代码地址 | https://github.com/Nightmare-n/UniPAD 关注「AI前沿速递」公众号&#xff0c;获取更多前沿资讯 01总览 这…

Android下QVideoFrame转QImage不成功记录

1.由于QVideoFrame::image() const : unsupported pixel format Format_ABGR32 &#xff0c;在转换时需要做个特殊处理如下,增加了android手机下的特殊格式处理: if(frame.pixelFormat() QVideoFrame::Format_ABGR32) 此部分代码 QImage imageFromVideoFrame(QVideoFrame &…

uniapp 打包 H5 实现在 uniapp 打包 APP 的 webview 通信

一、前言 遇到 uniapp 打包的 APP 在 webview 内嵌入 uniapp 打包的 H5 页面的需求&#xff0c;并实现通信。本篇主要总结了如何实现并总结遇到的问题&#xff0c;希望可以帮助大家减少负担。 实现需求主要有三个地方需要处理&#xff1a; index.html 的打包配置导入 uni.we…

STM32 CAN总线通讯

使用STM32的CAN通讯&#xff0c;利用回环模式&#xff0c;按键控制发送CAN数据&#xff0c;中断接收CAN数据并通过串口助手打印出来。 7.2、配置引脚信息 由于每次新建工程都需要配置信息&#xff0c;比较麻烦&#xff0c;好在STM32CubeIDE提供了导入.ioc文件的功能&#xff…

eclipse中svn从分支合并到主干及冲突解决

1、将分支先commit&#xff0c;然后再update&#xff0c;然后再clean一下&#xff0c;将项目多余的target都清理掉。 2、将branches切换到trunk 3、工程上右键-》Team-》合并&#xff08;或Merge&#xff09; 4、默认选项&#xff0c;点击Next 5、有未提交的改动&#xff0c;…

Python轻松设置Excel单元格数字显示格式

Excel作为强大的数据处理与分析工具&#xff0c;不仅能够存储大量数据&#xff0c;还支持复杂的数据处理与可视化功能。而如何恰当地展示Excel表格中的数据是Excel文件制作的关键之一。这便涉及到Excel单元格数字格式的设置。数字格式不仅关乎数据的美学呈现&#xff0c;如货币…

钒能新材料综合回收利用,钒溶液净化富集工艺之离子交换法

钒电池储能产业作为典型的绿色低碳优势产业&#xff0c;是新型储能领域重要发展方向。钒电池储能具备大规模、长周期等优势&#xff0c;是储能领域的重要组成部分&#xff0c;将成为拓展电能利用、应对可再生能源随机波动、支撑可再生能源高占比电力系统的最佳技术途径之一。 …

【R语言】地理探测器模拟及分析(Geographical detector)

地理探测器模拟及分析 1. 写在前面2. R语言实现2.1 数据导入2.2 确定数据离散化的最优方法与最优分类2.3 分异及因子探测器&#xff08;factor detector&#xff09;2.4 生态探测器&#xff08;ecological detector&#xff09;2.5 交互因子探测器&#xff08;interaction dete…

处理机调度算法即cpu scheduling

i Arrival Time 到达时间Burst Time服务时间 response time开始时间-到达时间 FCFS 按照进程顺序 finsh 按照进程顺序 从0开始依次加上服务时间 周转时间即 finsh时间-到达时间&#xff08;注意不是开始时间&#xff09; waiting time等待时间开始时间-到达时间 带权周转时…

VsCode-PlatformIO 开发环境搭建

在VScode中搜索PlatformIO&#xff0c;然后点击install 安装即可 安装后重新打开vscode&#xff0c;会出现如下界面。

Photoshop揭秘:图像处理领域的领军软件

Photoshop 是一款由 Adobe 企业开发的图像处理软件&#xff0c;也被大家简称为 PS。在广告设计、摄影后期、数字绘画、网页设计等各个领域都得到了广泛的应用&#xff0c;是目前业界最受欢迎的图像处理软件之一。作为一款图像处理软件&#xff0c;Photoshop 为设计者提供了许多…

接到一家公司做团购活动类型的策划海报项目,使用AI给他们设计了相关的海报

在这个充满挑战和机遇的时代&#xff0c;我有幸接到一家公司的委托&#xff0c;为他们策划一场团购活动。这不仅是对我的专业能力的认可&#xff0c;也是对我创新思维的考验。 这家公司是一家知名的电子产品销售商&#xff0c;他们希望通过团购活动来提升产品的销售量和品牌的…

基于国产飞腾2000制作的paddleocr hubserving服务docker镜像文件

目录导航 paddleocr hubserving国产化飞腾、鲲鹏armv8 api服务镜像制作 一、编译paddle 二、准备Dockerfile文件 三、制作paddleocr hubserving服务镜像 四、paddleocr hubserving镜像导出和导入 paddleocr hubserving国产化飞腾、鲲鹏armv8 api服务镜像制作 一、编译padd…