为了方便给自己的博客配图,用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,改为了适合自己博客使用,源程序的代码更通用,更推荐在它基础上修改。

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[异想家博客图片批量压缩程序]http://www.zyiz.net/tech/detail-103079.html

java 异想_异想家博客图片批量压缩程序相关推荐

  1. java 粒子滤波_粒子滤波 - gary_123 - 博客园

    跟着博主http://blog.csdn.net/heyijia0327/article/details/40899819一起学习 尽管利用高斯逼近能有效解决许多滤波问题,但当滤波分布为多模型或某些状 ...

  2. java元类_元类 - 一心不乱 - 博客园

    我们使用class机制产生的类,然后在通过类产生的对象 而类实际上都是通过type来实现的 首先确定type里需要添加哪些元素 class_name = 'A'   类名 class_base = ( ...

  3. java jui 正则表达式_正则表达式-Gorilla City-51CTO博客

    正则表达式,简称为regex,是文本模式的描述方法.例如,\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字. 使用步骤 python中所有正则表达式的函数都在re模块中. ▎python ...

  4. java数字常量_数字常量 - javawebsoa - 博客园

    数字常量 shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数 ...

  5. java 透传_透明传输 - javaadu - 博客园

    发送方和接收方数据的长度和内容完全一致,相当于一条无形的传输线. 关于透明传输的问题 透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络不管传输的业务如何,我只负责将需要传送的业务传送到 ...

  6. java 分部类_分部类 - Tekkaman - 博客园

    [分部类] 可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.如: 使用partial的几个要点: 1.所有部分都必须 ...

  7. Java线程池_刘锋的博客

    文章目录 线程和线程池的区别 线程池的七大参数 线程和线程池的区别 线程的join方法: 目的是使子线程去等待主线程执行完成的,具体的应用场景是,当主线程要使用子线程的计算结果的时候,但是子线程的运算 ...

  8. 期末学生HTML个人网页作业作品~蓝色的异清轩响应式个人博客模板源码~bootstrap响应式博客网站模板html...

    HTML期末大作业~ 蓝色的异清轩响应式个人博客模板源码~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还在为HTML网页设 ...

  9. 期末学生HTML个人网页作业作品~蓝色的异清轩响应式个人博客模板源码~bootstrap响应式博客网站模板html

    HTML期末大作业~ 蓝色的异清轩响应式个人博客模板源码~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还在为HTML网页设 ...

最新文章

  1. 希尔排序 - 数据结构和算法91
  2. uvalive 4795 Paperweight
  3. 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
  4. boost::type_erasure::subscriptable相关的测试程序
  5. 让oracle做定时任务【转】
  6. 计算某一段程序消耗的内存和时间【C#】
  7. *(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  8. 可自定义匹配规则查找控件_懂Excel轻松入门Python数据分析包pandas(二十八):二分法查找...
  9. 全文搜索引擎 Elasticsearch 安装
  10. ASP.NET MVC Action返回结果类型【转】
  11. Nginx开启gzip压缩功能
  12. 【静态化平台】☞( 一)网页静态化服务
  13. 使用shinydashboard编写高级UI页面(1)
  14. 如何使用浏览器网络监视工具进行黑客攻击
  15. 删除卸载不干净的任务 vmware卸载不干净->服务清理 / 注册表清理
  16. IndentationError: unindent does not match any outer indentation level 错误解决
  17. 纯ALOHA协议和时隙ALOHA协议简单总结
  18. U盘插上,系统有反应,但是却不识别,电脑能识别其他的U盘,U盘在其他电脑也是好用的经验分享(驱动问题)
  19. 基于Python技术的营养信息管理系统
  20. 解决docker权限不足问题

热门文章

  1. 厉害了!101岁老人挑战高空跳伞,被纳入吉尼斯世界纪录
  2. 学习的答案:为终身学习者赋能
  3. OceanBase 第六期技术征文活动|小鱼还能“更快”吗?你来试试
  4. mysql 好友列表设计_好友列表:关系数据库表设计
  5. “智领医疗 数创未来”成功举办,海量数据为医疗数字化创新赋能
  6. CPU与GPU到底有什么区别?
  7. 从数据库技术的40年发展历程看新征程(四)
  8. 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名
  9. 跟着oiiove学习Python的第二天:如何安装pycharm以及pycharm的基本操作/快捷键/插件等等
  10. 简单收集微信小程序formId,解决发送模板消息不够用的问题