Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

前端之家收集整理的这篇文章主要介绍了Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

效果图

代码

分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 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"&gt;0</span><span style="color: #000000"&gt;]
inputArgs.Quality,_ </span>= strconv.Atoi(strPice[<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;])
inputArgs.Width,_   </span>= strconv.Atoi(strPice[<span style="color: #800080"&gt;2</span><span style="color: #000000"&gt;])

pathTemp,top :</span>=<span style="color: #000000"&gt; isPictureFormat(inputArgs.LocalPath)
</span><span style="color: #0000ff"&gt;if</span> pathTemp == <span style="color: #800000"&gt;""</span><span style="color: #000000"&gt; {
    </span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* 目录 </span><span style="color: #008000"&gt;*/</span>
    <span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* 如果输入目录,那么是批量 </span><span style="color: #008000"&gt;*/</span><span style="color: #000000"&gt;
    fmt.Println(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;开始批量压缩...</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
    rs :</span>=<span style="color: #000000"&gt; []rune(inputArgs.LocalPath)
    end :</span>=<span style="color: #000000"&gt; len(rs)
    substr :</span>= <span style="color: #0000ff"&gt;string</span>(rs[end-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;:end])
    </span><span style="color: #0000ff"&gt;if</span> substr==<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt; {
        </span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* 有 / </span><span style="color: #008000"&gt;*/</span><span style="color: #000000"&gt;
        rs :</span>=<span style="color: #000000"&gt; []rune(inputArgs.LocalPath)
        end :</span>=<span style="color: #000000"&gt; len(rs)
        substr :</span>= <span style="color: #0000ff"&gt;string</span>(rs[<span style="color: #800080"&gt;0</span>:end-<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;])
        endIndex :</span>= strings.LastIndex(substr,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
        inputArgs.OutputPath </span>= <span style="color: #0000ff"&gt;string</span>(rs[<span style="color: #800080"&gt;0</span>:endIndex])+<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/LghImageCompress/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;
    }</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt; {
        endIndex :</span>= strings.LastIndex(inputArgs.LocalPath,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
        inputArgs.OutputPath </span>= <span style="color: #0000ff"&gt;string</span>(rs[<span style="color: #800080"&gt;0</span>:endIndex])+<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/LghImageCompress/</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;
    }
    getFilelist(inputArgs.LocalPath)
}</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;{
    </span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* 单个 </span><span style="color: #008000"&gt;*/</span>
    <span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* 如果输入<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>,那么是单个,允许<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>路径 </span><span style="color: #008000"&gt;*/</span><span style="color: #000000"&gt;
    fmt.Println(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;开始单张压缩...</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
    inputArgs.OutputPath </span>= top+<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;_compress.</span><span style="color: #800000"&gt;"</span>+<span style="color: #000000"&gt;format
    </span><span style="color: #0000ff"&gt;if</span> !<span style="color: #000000"&gt;imageCompress(
        func() (io.Reader,error){
            </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; os.Open(inputArgs.LocalPath)
        },func() (</span>*<span style="color: #000000"&gt;os.File,error) {
            </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; os.Open(inputArgs.LocalPath)
        },inputArgs.OutputPath,inputArgs.Quality,inputArgs.Width,format) {
        fmt.Println(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;<a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/suoluetu/" target="_blank" class="keywords">缩略图</a>失败</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
    }</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;{
        fmt.Println(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;<a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/suoluetu/" target="_blank" class="keywords">缩略图</a>成功 </span><span style="color: #800000"&gt;"</span>+<span style="color: #000000"&gt;inputArgs.OutputPath)
        finish()
    }
}</span><span style="color: #000000"&gt;

}

函数(核心):

自带的 image/jpeg 库。所谓的宽高完全自定义修改,就在这里,我是采用了等比例缩放,所以只需要传入其中一项。里面分两次读写同一个文件是因为一次用于尺寸读取,而且两次是不能共用的,会出错。

<div class="cnblogs_code">

       getDecodeFile func() (*     to             format )      文件 
     file_origin,err :=       err !=         fmt.Println(错误           
                     
     temp,err =      err !=         fmt.Println(           
           format =     
      format== || format ==         typeImage = 
         origin,err =          err !=             fmt.Println(               
          temp,err =          err !=             fmt.Println(               
          config,err =          err !=             fmt.Println(              
      }  format==         typeImage = 
         origin,err =          err !=             fmt.Println(               
          temp,err =          err !=             fmt.Println(               
          config,err =          err !=             fmt.Println(              
       
     width  := () 
     height := (*config.Height/ 
     canvas :=     file_out,err :=       err !=           
       typeImage==         err =          err!=             fmt.Println(图片失败              
      }         err = jpeg.Encode(file_out,canvas,&          err!=             fmt.Println(图片失败              
   
      
 }

代码

  

猜你在找的Go相关文章