效果图
代码
分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 exe 程序,可以在 Window 下运行。也可以放到 Linux 环境下编译运行,golang 是一种静态、跨平台的语言。
效果图
提示的文字输出,execute 是核心,压缩函数的调用也在里面
time.Sleep( * time.Minute) 退出,延时5分钟
}
提示函数
图片到8~9K,200px宽度,仅用了6秒左右,win 10,12G,i5,ssd。
自动遍历用户输入的文件夹里面的所有符合格式的文件,并进行压缩。
tips := [] 文件夹或图片路径: 文件夹,那么该目录的图片将会被批量压缩; 图片路径,那么将会被单独压缩处理。 文件夹,里面的图片质量压缩到75%,宽分辨率为200,高是等比例计算 文件夹里面的 1.jpg 图片,质量压缩到75%,宽分辨率为200,高是等比例计算 itemLen := i :=;i i == itemLen - } }
添加可以自定义
type InputArgs OutputPath 输出目录
LocalPath 文件路径
Quality
Width
}
图片格式验证
自定义支持的文件格式,主要是图片的格式,同时拆分返回一些关键的信息,例如尾缀
图片
func isPictureFormat(path ) (,, temp := strings.Split(path, len(temp) <= ,,
mapRule := make(map[ mapRule[] =
mapRule[] =
mapRule[] =
添加其他格式
mapRule[temp[]] == println(temp[ path,temp[],temp[ } ,
}
文件夹遍历
图片文件遍历,和要保存到的文件夹的创建,和采用纳秒级做压缩后的图片的名称。
func getFilelist(path 输出目录
errC := os.MkdirAll(inputArgs.OutputPath, errC != fmt.Printf(
err := filepath.Walk(path,func(pathFound ( f == f.IsDir() {
文件
图片
localPath,format,_ := 随机数
t := millis := t.Nanosecond()
outputPath := inputArgs.OutputPath+strconv.FormatInt(int64(millis),)++ localPath!= ! func() (* fmt.Println(生成缩略图失败 } fmt.Println(生成缩略图成功 + err != fmt.Printf( }
函数:
用户路径的输入以及最终压缩输出文件目录的路径组合。这里有个坑点,对于控制台的数据获取,最好使用 输出错误提示信息的时候也会被当作输入读取了,而不是用户输入的。
<div class="cnblogs_code">
获取输入
=== strings.Split((data), )
len(strPice) < 数量不足,请重新输入或退出程序:inputArgs.LocalPath </span>= strPice[<span style="color: #800080">0</span><span style="color: #000000">]
inputArgs.Quality,_ </span>= strconv.Atoi(strPice[<span style="color: #800080">1</span><span style="color: #000000">])
inputArgs.Width,_ </span>= strconv.Atoi(strPice[<span style="color: #800080">2</span><span style="color: #000000">])
pathTemp,top :</span>=<span style="color: #000000"> isPictureFormat(inputArgs.LocalPath)
</span><span style="color: #0000ff">if</span> pathTemp == <span style="color: #800000">""</span><span style="color: #000000"> {
</span><span style="color: #008000">/*</span><span style="color: #008000">* 目录 </span><span style="color: #008000">*/</span>
<span style="color: #008000">/*</span><span style="color: #008000">* 如果输入目录,那么是批量 </span><span style="color: #008000">*/</span><span style="color: #000000">
fmt.Println(</span><span style="color: #800000">"</span><span style="color: #800000">开始批量压缩...</span><span style="color: #800000">"</span><span style="color: #000000">)
rs :</span>=<span style="color: #000000"> []rune(inputArgs.LocalPath)
end :</span>=<span style="color: #000000"> len(rs)
substr :</span>= <span style="color: #0000ff">string</span>(rs[end-<span style="color: #800080">1</span><span style="color: #000000">:end])
</span><span style="color: #0000ff">if</span> substr==<span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000"> {
</span><span style="color: #008000">/*</span><span style="color: #008000">* 有 / </span><span style="color: #008000">*/</span><span style="color: #000000">
rs :</span>=<span style="color: #000000"> []rune(inputArgs.LocalPath)
end :</span>=<span style="color: #000000"> len(rs)
substr :</span>= <span style="color: #0000ff">string</span>(rs[<span style="color: #800080">0</span>:end-<span style="color: #800080">1</span><span style="color: #000000">])
endIndex :</span>= strings.LastIndex(substr,<span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000">)
inputArgs.OutputPath </span>= <span style="color: #0000ff">string</span>(rs[<span style="color: #800080">0</span>:endIndex])+<span style="color: #800000">"</span><span style="color: #800000">/LghImageCompress/</span><span style="color: #800000">"</span><span style="color: #000000">;
}</span><span style="color: #0000ff">else</span><span style="color: #000000"> {
endIndex :</span>= strings.LastIndex(inputArgs.LocalPath,<span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000">)
inputArgs.OutputPath </span>= <span style="color: #0000ff">string</span>(rs[<span style="color: #800080">0</span>:endIndex])+<span style="color: #800000">"</span><span style="color: #800000">/LghImageCompress/</span><span style="color: #800000">"</span><span style="color: #000000">;
}
getFilelist(inputArgs.LocalPath)
}</span><span style="color: #0000ff">else</span><span style="color: #000000">{
</span><span style="color: #008000">/*</span><span style="color: #008000">* 单个 </span><span style="color: #008000">*/</span>
<span style="color: #008000">/*</span><span style="color: #008000">* 如果输入<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>,那么是单个,允许<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>路径 </span><span style="color: #008000">*/</span><span style="color: #000000">
fmt.Println(</span><span style="color: #800000">"</span><span style="color: #800000">开始单张压缩...</span><span style="color: #800000">"</span><span style="color: #000000">)
inputArgs.OutputPath </span>= top+<span style="color: #800000">"</span><span style="color: #800000">_compress.</span><span style="color: #800000">"</span>+<span style="color: #000000">format
</span><span style="color: #0000ff">if</span> !<span style="color: #000000">imageCompress(
func() (io.Reader,error){
</span><span style="color: #0000ff">return</span><span style="color: #000000"> os.Open(inputArgs.LocalPath)
},func() (</span>*<span style="color: #000000">os.File,error) {
</span><span style="color: #0000ff">return</span><span style="color: #000000"> os.Open(inputArgs.LocalPath)
},inputArgs.OutputPath,inputArgs.Quality,inputArgs.Width,format) {
fmt.Println(</span><span style="color: #800000">"</span><span style="color: #800000"><a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/suoluetu/" target="_blank" class="keywords">缩略图</a>失败</span><span style="color: #800000">"</span><span style="color: #000000">)
}</span><span style="color: #0000ff">else</span><span style="color: #000000">{
fmt.Println(</span><span style="color: #800000">"</span><span style="color: #800000"><a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/suoluetu/" target="_blank" class="keywords">缩略图</a>成功 </span><span style="color: #800000">"</span>+<span style="color: #000000">inputArgs.OutputPath)
finish()
}
}</span><span style="color: #000000">
}