java 异想_异想家博客图片批量压缩程序
为了方便给自己的博客配图,用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 异想_异想家博客图片批量压缩程序相关推荐
- java 粒子滤波_粒子滤波 - gary_123 - 博客园
跟着博主http://blog.csdn.net/heyijia0327/article/details/40899819一起学习 尽管利用高斯逼近能有效解决许多滤波问题,但当滤波分布为多模型或某些状 ...
- java元类_元类 - 一心不乱 - 博客园
我们使用class机制产生的类,然后在通过类产生的对象 而类实际上都是通过type来实现的 首先确定type里需要添加哪些元素 class_name = 'A' 类名 class_base = ( ...
- java jui 正则表达式_正则表达式-Gorilla City-51CTO博客
正则表达式,简称为regex,是文本模式的描述方法.例如,\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字. 使用步骤 python中所有正则表达式的函数都在re模块中. ▎python ...
- java数字常量_数字常量 - javawebsoa - 博客园
数字常量 shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数 ...
- java 透传_透明传输 - javaadu - 博客园
发送方和接收方数据的长度和内容完全一致,相当于一条无形的传输线. 关于透明传输的问题 透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络不管传输的业务如何,我只负责将需要传送的业务传送到 ...
- java 分部类_分部类 - Tekkaman - 博客园
[分部类] 可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.如: 使用partial的几个要点: 1.所有部分都必须 ...
- Java线程池_刘锋的博客
文章目录 线程和线程池的区别 线程池的七大参数 线程和线程池的区别 线程的join方法: 目的是使子线程去等待主线程执行完成的,具体的应用场景是,当主线程要使用子线程的计算结果的时候,但是子线程的运算 ...
- 期末学生HTML个人网页作业作品~蓝色的异清轩响应式个人博客模板源码~bootstrap响应式博客网站模板html...
HTML期末大作业~ 蓝色的异清轩响应式个人博客模板源码~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还在为HTML网页设 ...
- 期末学生HTML个人网页作业作品~蓝色的异清轩响应式个人博客模板源码~bootstrap响应式博客网站模板html
HTML期末大作业~ 蓝色的异清轩响应式个人博客模板源码~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还在为HTML网页设 ...
最新文章
- 希尔排序 - 数据结构和算法91
- uvalive 4795 Paperweight
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
- boost::type_erasure::subscriptable相关的测试程序
- 让oracle做定时任务【转】
- 计算某一段程序消耗的内存和时间【C#】
- *(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
- 可自定义匹配规则查找控件_懂Excel轻松入门Python数据分析包pandas(二十八):二分法查找...
- 全文搜索引擎 Elasticsearch 安装
- ASP.NET MVC Action返回结果类型【转】
- Nginx开启gzip压缩功能
- 【静态化平台】☞( 一)网页静态化服务
- 使用shinydashboard编写高级UI页面(1)
- 如何使用浏览器网络监视工具进行黑客攻击
- 删除卸载不干净的任务 vmware卸载不干净->服务清理 / 注册表清理
- IndentationError: unindent does not match any outer indentation level 错误解决
- 纯ALOHA协议和时隙ALOHA协议简单总结
- U盘插上,系统有反应,但是却不识别,电脑能识别其他的U盘,U盘在其他电脑也是好用的经验分享(驱动问题)
- 基于Python技术的营养信息管理系统
- 解决docker权限不足问题
热门文章
- 厉害了!101岁老人挑战高空跳伞,被纳入吉尼斯世界纪录
- 学习的答案:为终身学习者赋能
- OceanBase 第六期技术征文活动|小鱼还能“更快”吗?你来试试
- mysql 好友列表设计_好友列表:关系数据库表设计
- “智领医疗 数创未来”成功举办,海量数据为医疗数字化创新赋能
- CPU与GPU到底有什么区别?
- 从数据库技术的40年发展历程看新征程(四)
- 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名
- 跟着oiiove学习Python的第二天:如何安装pycharm以及pycharm的基本操作/快捷键/插件等等
- 简单收集微信小程序formId,解决发送模板消息不够用的问题