Golang 图片压缩可以直接使用第三方包 resize

安装

1
$ go get github.com/nfnt/resize

使用

导入

1
import "github.com/nfnt/resize"

语法

resize 有两个方法 Resize Thumbnail

1
2
resize.Resize(width, height uint, img image.Image, interp resize.InterpolationFunction) image.Image
// resize.Resize 使用插值函数interp创建具有新尺寸(宽度,高度)的缩放图像。 如果宽度或高度设置为0,则将其设置为保留宽高比值。
1
2
resize.Thumbnail(maxWidth, maxHeight uint, img image.Image, interp resize.InterpolationFunction) image.Image
// resize.Thumbnail 缩小图像,将其纵横比保持为最大尺寸(maxWidth,maxHeight)。 如果原始尺寸小于提供的尺寸,它将返回原始图像。

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"fmt"
"github.com/nfnt/resize"
"image/png"
"os"
"log"
)

func main() {
file_path := "/Users/wxnacy/Downloads/react-app1.png"

fmt.Println("Hello World")
file, err := os.Open(file_path)
if err != nil {
log.Fatal(err)
}

// decode jpeg into image.Image
img, err := png.Decode(file)
if err != nil {
log.Fatal(err)
}
file.Close()

// resize to width 1000 using Lanczos resampling
// and preserve aspect ratio
m := resize.Resize(800, 0, img, resize.NearestNeighbor)

out, err := os.Create("react.NearestNeighbor.png")
if err != nil {
log.Fatal(err)
}
defer out.Close()

// write new image to file
png.Encode(out, m)
}

这里边需要关注的是参数 resize.InterpolationFunction,它有几个值

这个压缩方式的展示效果可以从这里看到 https://github.com/nfnt/resize#downsizing-samples

我挨个点连接进行,发现实在不想去纠结他们的具体原理,我只想比较压缩后的文件大小

我依次按照集中格式进行了压缩,我们对比下文件大小

1
2
3
4
5
6
7
-rw-r--r--@  1 wxnacy  staff  64633 Jan 18 18:01 react-app1.png
-rw-r--r--@ 1 wxnacy staff 19857 Jan 19 17:13 react.NearestNeighbor.png
-rw-r--r-- 1 wxnacy staff 23336 Jan 19 17:12 react.Bilinear.png
-rw-r--r-- 1 wxnacy staff 25966 Jan 19 17:12 react.MitchellNetravali.png
-rw-r--r--@ 1 wxnacy staff 27241 Jan 19 17:12 react.Lanczos2.png
-rw-r--r-- 1 wxnacy staff 27356 Jan 19 17:12 react.Bicubic.png
-rw-r--r--@ 1 wxnacy staff 31222 Jan 19 17:09 react.Lanczos3.png

经过对比,Lanczos3 算法文件最大,图片最清晰,NearestNeighbor 最差

ok,这样我们就知道了,如果你追求清晰的或者文件大小该选什么类型了

03-16 21:09