资讯专栏INFORMATION COLUMN

nodejs 全自动使用 Tinypng (免费版,无需任何配置)压缩图片

BigTomato / 1535人阅读

摘要:前端一直比较喜欢压缩图片,但是每次都要用手拖来拖去,很累最近不忙了,撸了一段行的代码,一个命令全自动压缩文件夹包含子文件夹里所有大小小于的和图片,亲测成功,再次感谢。

前端一直比较喜欢tinypng压缩图片,但是每次都要用手拖来拖去,很累.
最近不忙了,node撸了一段100行的代码,一个命令全自动压缩文件夹(包含子文件夹)里所有大小小于5MBjpgpng图片,亲测成功,再次感谢tinypng

大体思路:

递归获取本地文件夹里的文件

过滤文件,格式必须是.jpg .png,大小小于5MB.(文件夹递归)

每次只处理一个文件(可以绕过20个的数量限制)

处理返回数据拿到远程优化图片地址

取回图片更新本地图片

纯node实现不依赖任何其他代码片段

上代码:

const fs = require("fs");
const path = require("path");
const https = require("https");
const crypto = require("crypto");
const { URL } = require("url");

const root = "./",
  exts = [".jpg", ".png"],
  max = 5200000; // 5MB == 5242848.754299136

const options = {
  method: "POST",
  hostname: "tinypng.com",
  path: "/web/shrink",
  headers: {
    rejectUnauthorized: false,
    "Postman-Token": Date.now(),
    "Cache-Control": "no-cache",
    "Content-Type": "application/x-www-form-urlencoded",
    "User-Agent":
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
  }
};

fileList(root);

// 获取文件列表
function fileList(folder) {
  fs.readdir(folder, (err, files) => {
    if (err) console.error(err);
    files.forEach(file => {
      fileFilter(folder + file);
    });
  });
}

// 过滤文件格式,返回所有jpg,png图片
function fileFilter(file) {
  fs.stat(file, (err, stats) => {
    if (err) return console.error(err);
    if (
      // 必须是文件,小于5MB,后缀 jpg||png
      stats.size <= max &&
      stats.isFile() &&
      exts.includes(path.extname(file))
    ) {
      fileUpload(file); // console.log("可以压缩:" + file);
    }
    if (stats.isDirectory()) fileList(file + "/");
  });
}
// 异步API,压缩图片
// {"error":"Bad request","message":"Request is invalid"}
// {"input": { "size": 887, "type": "image/png" },"output": { "size": 785, "type": "image/png", "width": 81, "height": 81, "ratio": 0.885, "url": "https://tinypng.com/web/output/7aztz90nq5p9545zch8gjzqg5ubdatd6" }}
function fileUpload(img) {
  var req = https.request(options, function(res) {
    res.on("data", buf => {
      let obj = JSON.parse(buf.toString());
      if (obj.error) {
        console.log(`[${img}]:压缩失败!报错:${obj.message}`);
      } else {
        fileUpdate(img, obj);
      }
    });
  });

  req.write(fs.readFileSync(img), "binary");
  req.on("error", e => {
    console.error(e);
  });
  req.end();
}
// 该方法被循环调用,请求图片数据
function fileUpdate(imgpath, obj) {
  let options = new URL(obj.output.url);
  let req = https.request(options, res => {
    let body = "";
    res.setEncoding("binary");
    res.on("data", function(data) {
      body += data;
    });

    res.on("end", function() {
      fs.writeFile(imgpath, body, "binary", err => {
        if (err) return console.error(err);
        console.log(
          `[${imgpath}] 
 压缩成功,原始大小-${obj.input.size},压缩大小-${
            obj.output.size
          },优化比例-${obj.output.ratio}`
        );
      });
    });
  });
  req.on("error", e => {
    console.error(e);
  });
  req.end();
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95897.html

相关文章

  • 非常实用的在线工具网站清单

    摘要:文章目录在线图片压缩在线压缩最好用的切图工具在线工具一键抠图免费字体免费素材图片和视频中国风配色网站免费壁纸免费短连接在线在线代码编辑在线流程图思维导图在线图片压缩传送门在线图片压缩网站已经优化超过十亿张图片,支持,,等格式的图片的压缩。 ...

    XanaHopper 评论0 收藏0
  • tinypng upload一键压缩上传工具

    摘要:关于这是一个基于的图片压缩上传工具,压缩过程主要通过调用提供的完成。因为是桌面端,所以很方便我们将图片拖拽到任务托盘进行压缩上传,极大地提升了前端的工作效率,可以让我们更专注于业务开发。 地址 项目地址:tinypng-upload 有兴趣的可以玩一玩,因为平时经常会用到图片压缩,上传,如果你也觉得很繁琐的话,这个将会解决你的痛点。 关于 tinypng-upload 这是一个基于 e...

    hlcc 评论0 收藏0
  • 开箱即用-简洁实用的ImgURL图床相册程序和Zdir目录列表程序(文件管理器)

    摘要:本篇文章就来分享一下两款开箱即用上手容易的图床相册程序和在线文件管理器目录列表程序,由好友开发并维护,非常适合个人站长用作图床相册和文件下载分享。虽然说现在照片还有文件存储等都可以上传到网盘中,但是国内的网盘与国外的网盘存储还有点不一样。以百度网盘与Dropbox对比为例,百度网盘顶多算是一个个人用来存放私人照片和文件的网络硬盘,如果用来分享的话很容易被百度限制或者取消下载。很多的个人站长为...

    番茄西红柿 评论0 收藏2637
  • 【长期更新】盘一盘那些 uTools 高质量插件,让你的工作效率瞬间提升N倍!

    摘要:参考增强神器,文档搜索效率何止翻倍推荐系数图片展示快速获取文件文件夹名称插件来源开发者插件介绍如名,鼠标选中文件或者文件夹,点击鼠标中键激活插件即可将文件文件夹名称复制到剪切板。 ...

    remcarpediem 评论0 收藏0
  • 移动端H5页面注意事项

    摘要:移动端活动页面常常需要能够分享到各种社交中,常用的有微信等。微信二维码问题同一个页面里要是有两个二维码,长按扫描总是只能扫出左侧第一个二维码。 首发于简书博客:http://www.jianshu.com/p/e958... 2017-11-25 更新:5. 使用 Gulp 拼合图片 1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶...

    weknow619 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<