Golang 代码程序案例

时间:2025-03-08 07:29:29
  • 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分钟 */
  • }