package main
import (
"bufio"
"fmt"
"/nfnt/resize"
"image"
"image/jpeg"
"image/png"
"io"
"log"
"os"
"path/filepath"
"strconv"
"strings"
"time"
)
func imageCompress(
getReadSizeFile func() (, error),
getDecodeFile func() (*, error),
to string,
Quality,
base int,
format string) bool {
/** 读取文件 */
file_origin, err := getDecodeFile()
defer file_origin.Close()
if err != nil {
("(file)错误")
(err)
return false
}
var origin
var config
var temp
/** 读取尺寸 */
temp, err = getReadSizeFile()
if err != nil {
("(temp)")
(err)
return false
}
var typeImage int64
format = (format)
/** jpg 格式 */
if format == "jpg" || format == "jpeg" {
typeImage = 1
origin, err = (file_origin)
if err != nil {
("(file_origin)")
(err)
return false
}
temp, err = getReadSizeFile()
if err != nil {
("(temp)")
(err)
return false
}
config, err = (temp)
if err != nil {
("(temp)")
return false
}
} else if format == "png" {
typeImage = 0
origin, err = (file_origin)
if err != nil {
("(file_origin)")
(err)
return false
}
temp, err = getReadSizeFile()
if err != nil {
("(temp)")
(err)
return false
}
config, err = (temp)
if err != nil {
("(temp)")
return false
}
}
/** 做等比缩放 */
width := uint(base) /** 基准 */
height := uint(base * / )
canvas := (width, height, origin, resize.Lanczos3)
file_out, err := (to)
defer file_out.Close()
if err != nil {
(err)
return false
}
if typeImage == 0 {
err = (file_out, canvas)
if err != nil {
("压缩图片失败")
return false
}
} else {
err = (file_out, canvas, &{Quality})
if err != nil {
("压缩图片失败")
return false
}
}
return true
}
func getFilelist(path string) {
/** 创建输出目录 */
errC := (, 0777)
if errC != nil {
("%s", errC)
return
}
err := (path, func(pathFound string, f , err error) error {
if f == nil {
return err
}
if () { /** 是否是目录 */
return nil
}
// println(pathFound)
/** 找到一个文件 */
/** 判断是不是图片 */
localPath, format, _ := isPictureFormat(pathFound)
/** 随机数 */
t := ()
millis := () /** 纳秒 */
outputPath := + (int64(millis), 10) + "." + format
if localPath != "" {
if !imageCompress(
func() (, error) {
return (localPath)
},
func() (*, error) {
return (localPath)
},
outputPath,
,
,
format) {
("生成缩略图失败")
} else {
("生成缩略图成功 " + outputPath)
}
}
return nil
})
if err != nil {
("输入的路径信息有误 %v\n", err)
}
}
/** 是否是图片 */
func isPictureFormat(path string) (string, string, string) {
temp := (path, ".")
if len(temp) <= 1 {
return "", "", ""
}
//创建map类型值,其中key是string类型,value是int64类型
mapRule := make(map[string]int64)
mapRule["jpg"] = 1
mapRule["png"] = 1
mapRule["jpeg"] = 1
// (temp[1]+"---")
/** 添加其他格式 */
if mapRule[temp[1]] == 1 {
println(temp[1])
return path, temp[1], temp[0]
} else {
return "", "", ""
}
}
func execute() {
/** 获取输入 */
//str := ""
// (&str) /** 不要使用 scanf,它不会并以一个新行结束输入 */
//从Console中获取输入的信息
reader := ()
data, _, _ := ()
/** 分割 */
//将以空格分割开的字符串解析成数组
strPice := (string(data), " ") /** 空格 */
if len(strPice) < 3 {
("输入有误,参数数量不足,请重新输入或退出程序:")
execute()
return
}
//将输入信息赋值给inputArgs对象
= strPice[0]
//将字符串转换成int类型
, _ = (strPice[1])
, _ = (strPice[2])
pathTemp, format, top := isPictureFormat()
if pathTemp == "" {
/** 目录 */
/** 如果输入目录,那么是批量 */
("开始批量压缩...")
rs := []rune()
end := len(rs)
substr := string(rs[end-1 : end])
if substr == "/" {
/** 有 / */
rs := []rune()
end := len(rs)
substr := string(rs[0 : end-1])
endIndex := (substr, "/")
= string(rs[0:endIndex]) + "/LghImageCompress/"
} else {
endIndex := (, "/")
= string(rs[0:endIndex]) + "/LghImageCompress/"
}
getFilelist()
("图片保存在文件夹 " + )
} else {
/** 单个 */
/** 如果输入文件,那么是单个,允许自定义路径 */
("开始单张压缩...") //C:\Users\lzq\Desktop\ 75 200
= top + "_compress." + format
//内部函数
if !imageCompress(
func() (, error) {
return ()
},
func() (*, error) {
return ()
},
,
,
,
format) {
("生成缩略图失败")
} else {
("生成缩略图成功 " + )
finish()
}
}
(5 * ) /** 如果不是自己点击退出,延时5分钟 */
}
func finish() {
("继续输入进行压缩或者退出程序:")
execute()
}
func showTips() {
//字符串数组的定义方法
tips := []string{
"请输入文件夹或图片路径:",
"如果输入文件夹,那么该目录的图片将会被批量压缩;",
"如果是图片路径,那么将会被单独压缩处理。",
"例如:",
"C:/Users/lzq/Desktop/headImages/ 75 200",
"指桌面 headImages 文件夹,里面的图片质量压缩到75%,宽分辨率为200,高是等比例计算",
"C:/Users/lzq/Desktop/headImages/ 75 200",
"指桌面的 headImages 文件夹里面的 图片,质量压缩到75%,宽分辨率为200,高是等比例计算 ",
"请输入:"}
//计算字符串数组的长度
itemLen := len(tips)
for i := 0; i < itemLen; i++ {
if i == itemLen-1 {
(tips[i])
} else {
(tips[i])
}
}
}
type InputArgs struct {
OutputPath string /** 输出目录 */
LocalPath string /** 输入的目录或文件路径 */
Quality int /** 质量 */
Width int /** 宽度尺寸,像素单位 */
Format string /** 格式 */
}
var inputArgs InputArgs
func main() {
showTips()
execute()
(5 * ) /** 如果不是自己点击退出,延时5分钟 */
}