异想家博客图片批量压缩程序

为了方便给自己的博客配图,用Golang写了一个脚本处理,现分享出来,有需要的朋友也可以参考修改使用。

压缩规则

1、图片都等比例压缩,不破坏长宽比。

2、如果是横屏图片,压缩到宽度为1280,高度适应。

3、如果是竖屏图片,压缩到高度为1000,宽度适应。

4、如果分辨率小于这个,不压缩。

5、支持png、jpg、jpeg。

使用方法

go build jfzBlogPicCompress.go

原图放在当前目录下的raw目录中,压缩后的图片生成在thumb目录下,运行生成的二进制文件即可,压缩完5s后程序退出。

源码

文件名jfzBlogPicCompress.go:

package main

import (
    "fmt"
    "github.com/nfnt/resize"
    "image"
    "image/jpeg"
    "image/png"
    "io"
    "log"
    "os"
    "path/filepath"
    "strings"
    "time"
)

type InputArgs struct {
    OutputPath string /** 输出目录 */
    LocalPath  string /** 输入的目录或文件路径 */
    Quality    int    /** 质量 */
    Width      int    /** 宽度尺寸,像素单位 */
    Format     string /** 格式 */
}

var inputArgs InputArgs

func main() {
    execute()
    fmt.Printf("处理完成,5秒后自动退出……")
    time.Sleep(5 * time.Second) /** 如果不是自己点击退出,延时5s */
}

//  执行压缩
func execute() {
    fmt.Println("开始批量压缩...")

    inputArgs.LocalPath = "./raw/"
    inputArgs.OutputPath = "./thumb/"
    inputArgs.Quality = 90
    inputArgs.Width = 1280
    fmt.Println("压缩规则:宽度1280,如果是竖图,高度1000  压缩质量:", inputArgs.Quality)

    GetFilelist(inputArgs.LocalPath)
    fmt.Println("图片保存在:" + inputArgs.OutputPath)
}

// 遍历输入原图目录的图片
func GetFilelist(path string) {
    /** 创建输出目录 */
    errC := os.MkdirAll(inputArgs.OutputPath, 0777)
    if errC != nil {
        fmt.Printf("%s", errC)
        return
    }
    err := filepath.Walk(path, func(pathFound string, f os.FileInfo, err error) error {
        if f == nil {
            return err
        }
        // 是否是目录
        if f.IsDir() {
            return nil
        }
        // 文件是否是图片
        localPath, format, _ := isPictureFormat(pathFound)
        outputPath := strings.Replace(localPath, "raw", "thumb", 1)
        if localPath != "" {
            if !imageCompress(
                func() (io.Reader, error) {
                    return os.Open(localPath)
                },
                func() (*os.File, error) {
                    return os.Open(localPath)
                },
                outputPath,
                inputArgs.Quality,
                inputArgs.Width,
                format) {
                fmt.Println("生成缩略图失败")
            } else {
                fmt.Println("生成缩略图成功 " + outputPath)
            }
        }
        return nil
    })
    if err != nil {
        fmt.Printf("输入的路径信息有误 %v\n", err)
    }
}

// 压缩算法
func imageCompress(
    getReadSizeFile func() (io.Reader, error),
    getDecodeFile func() (*os.File, error),
    to string,
    Quality,
    base int,
    format string) bool {
    // 读取文件
    file_origin, err := getDecodeFile()
    defer file_origin.Close()
    if err != nil {
        fmt.Println("os.Open(file)错误")
        log.Fatal(err)
        return false
    }
    var origin image.Image
    var config image.Config
    var temp io.Reader

    // 读取尺寸
    temp, err = getReadSizeFile()
    if err != nil {
        fmt.Println("os.Open(temp)")
        log.Fatal(err)
        return false
    }
    var typeImage int64
    format = strings.ToLower(format)
    if format == "jpg" || format == "jpeg" {
        // jpg 格式 1
        typeImage = 1
        origin, err = jpeg.Decode(file_origin)
        if err != nil {
            fmt.Println("jpeg.Decode(file_origin)")
            log.Fatal(err)
            return false
        }
        temp, err = getReadSizeFile()
        if err != nil {
            fmt.Println("os.Open(temp)")
            log.Fatal(err)
            return false
        }
        config, err = jpeg.DecodeConfig(temp)
        if err != nil {
            fmt.Println("jpeg.DecodeConfig(temp)")
            return false
        }

    } else if format == "png" {
        // png 格式 0
        typeImage = 0
        origin, err = png.Decode(file_origin)
        if err != nil {
            fmt.Println("png.Decode(file_origin)")
            log.Fatal(err)
            return false
        }
        temp, err = getReadSizeFile()
        if err != nil {
            fmt.Println("os.Open(temp)")
            log.Fatal(err)
            return false
        }
        config, err = png.DecodeConfig(temp)
        if err != nil {
            fmt.Println("png.DecodeConfig(temp)")
            return false
        }
    }
    // 等比缩放(压缩到1280的宽,如果图片是竖着的,限定高最多1000)
    fixBase := base
    heightBase := fixBase * config.Height / config.Width
    if config.Height > config.Width {
        heightBase = 1000
        fixBase = heightBase * config.Width / config.Height
    }

    // 基准
    width := uint(fixBase)
    height := uint(heightBase)

    canvas := resize.Thumbnail(width, height, origin, resize.Lanczos3)
    file_out, err := os.Create(to)
    defer file_out.Close()
    if err != nil {
        log.Fatal(err)
        return false
    }
    if typeImage == 0 {
        err = png.Encode(file_out, canvas)
        if err != nil {
            fmt.Println("压缩图片失败")
            return false
        }
    } else {
        err = jpeg.Encode(file_out, canvas, &jpeg.Options{Quality})
        if err != nil {
            fmt.Println("压缩图片失败")
            return false
        }
    }

    return true
}

// 是否是图片
func isPictureFormat(path string) (string, string, string) {
    temp := strings.Split(path, ".")
    if len(temp) <= 1 {
        return "", "", ""
    }
    mapRule := make(map[string]int64)
    // 在这里可以添加其他格式
    mapRule["jpg"] = 1
    mapRule["JPG"] = 1
    mapRule["png"] = 1
    mapRule["PNG"] = 1
    mapRule["jpeg"] = 1
    mapRule["JPEG"] = 1
    if mapRule[temp[1]] == 1 {
        println(temp[1])
        return path, temp[1], temp[0]
    } else {
        return "", "", ""
    }
}

参考

代码参考了golang_image_compress,改为了适合自己博客使用,源程序的代码更通用,更推荐在它基础上修改。

原文地址:https://www.cnblogs.com/sandeepin/p/jfz-blog-pic-compress.html

时间: 2024-09-30 02:47:38

异想家博客图片批量压缩程序的相关文章

如何将图片批量压缩?全面盘点这几种小方法

写在前面:现在的人们都喜欢用自己手机里的相机来记录自己生活中的点滴美好,而拍照成为人们记录自己生活的最常用的一个方式,这样当时间过去也会记得自己之前曾去过哪些地方,可是照片多了之后也很烦恼,图片太多,就容易出现体积过大的,在传输的时候特别麻烦,这就需要将图片进行压缩,如果图片过多,就需要进行批量压缩,那么如何将图片批量压缩?今天就来为大家爱全面盘点这几种小方法.一.软件压缩推荐指数:★★★★★借助工具:迅捷压缩软件介绍:迅捷压缩软件是一款操作简单,快捷高效的图片压缩,视频压缩,PDF压缩软件,能

Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片,在博客园不能用 CSDN 的图片. 当前想到的方案就是:先把 CSDN 上的图片都下载下来,再手动更新吧. 所以简单写了一个爬虫用来下载 CSDN 平台上的图片,用于在其他平台上更新图片时用 更多内容,请看代码注释 效果演示 Python 源代码 提示: 需要先下载 BeautifulSoup 哦,

博客与微信小程序的同步

在此之前,先说说自己最近的打算,才购买了阿里云的服务器,想做一个网站和图床网盘之类的方便自己使用. 考虑到小程序,又打算将自己的博客内容放到小程序中.从零开发实属困难,应该还要一段时间才能完成. 目前微信公众号已经在逐步的完善中. 这里不要脸的推荐一波. 原文地址:https://www.cnblogs.com/loufangcheng/p/11917318.html

httpd-2.4部署Discuz!论坛系统、wordpress博客系统和phpMyAdmin程序

检查环境(关闭防火墙和改变SELinux状态,保证外界可以访问): [[email protected] ~]# iptables -F //-F代表无论如何都关闭防火墙,生产环境不建议[[email protected] ~]# iptables -vnLChain INPUT (policy ACCEPT 5 packets, 448 bytes)pkts bytes target prot opt in out source destination Chain FORWARD (polic

七牛云测试域名到期博客图片问题

从上周末开始到今天,终于把七牛云到期的测试域名所属空间的博客照片迁移到腾讯云.腾讯云有一定量免费空间供用户使用(发博文时免费额度:50 GB 标准存储容量,10 GB CDN 回源流量,100 万次读请求,100 万次写请求.费用实例),希望腾讯云短期内不要出对没钱用户的制裁条款.当然,出了我们也不用慌,再迁移便是,正所谓不折腾不舒服斯基.果然免费的都是要付出其它代价的- 备份七牛云图片到本地 方案一:如果此时你处在工作日时间,可以参考此链接教你如何在七牛云域名过期后备份内容完成转移,让七牛云技

用IDM下载博客图片

前言 写博客的人一定都会有一个图床,将图片存在那里.发现自己以前没有注意图片来源问题,随手就贴在博客上面了.现在有不少图片都挂了,换句话来说有可能自己目前用的图床不提供服务了,那所有的图片都有可能丢失......所以打算写个脚本,把以前博客的图片保存下来,并在以后发博的时候注意保存本地图片.emmm,程序如下,主要是个人用脚本,所以很多地方就是图自己的方便.根据自己的情况写的: 代码 # -*- coding: utf-8 -*- import os import requests from b

博客图片点击放大

1. 进入博客,点击管理——>设置——>申请支持JS代码权限: 2. 支持JS代码后,在页脚Html代码中粘贴如下代码: <div id="shadediv" style="display: none;position: fixed;z-index: 1000;top: 0;left: 0; width: 100%;height: 100%;background-color: rgba(255,255,255,.8);"> <img i

【开源】开发者新闻APP+博客园新闻采集程序+infoq新闻采集程序+新闻Restful服务

这几天车子跟别人撞了,水箱撞稀烂了,要坐一个星期的公车 实在太无聊,就抽时间搞了这么个APP出来,打发公车上的时光 (开发者头条里的新闻专业性太强,公车上实在无法静心研读) 我经常看的也就博客园.infoq.36kr.开源中国的新闻 现在只做了博客园和infoq,接下来打算做36kr和开源中国的新闻,如果大家有什么好建议也可以在评论里提 数据都是准实时的取来的,以后争取做到你去刷就有新闻给你看 以后可能会做:新闻的分享.收藏.标签.分类等功能,当然这要看大家的热情程度啦! 废话少说,先来上图  

java 图片 批量 压缩 +全部压缩

/* oldsrc  : 原图片地址文件夹 如 'd:/' newsrc  : 压缩后图片地址文件夹 如 'e:/' widthdist,heightdist : 压缩后的宽和高 createtime 2010-11-25 @auto yijianfeng */ public void reduceImgAll(String oldsrc, String newsrc, int widthdist, int heightdist) { try { File file = new File(old