1 借助 nfnt/resize 修改图片的尺寸
2 借助 原生的 image/jpeg 修改质量

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
40
41
package fyimage
import (
    "bytes"
    "github.com/gogf/gf/os/glog"
    "github.com/nfnt/resize"
    "image"
    "image/jpeg"
)

// 默认最大高度
const MaxHeight uint = 1080

// 当文件是JPEG格式时,对文件进行压缩。
// 压缩的方式主要是借助原生的image/jpeg 修改图片的质量和像素的大小。
// 该方案并不是最优的方案,通过客户端首次进行压缩会大大减少服务端的压力
// 文件小于 1MB 或者不是jpeg格式,不再压缩
func CompressImageResource(data []byte) []byte {<!-- -->
    if len(data) < 1024*1024 {<!-- -->
        return  data
    }

    img, _, err := image.Decode(bytes.NewReader(data))
    if err != nil {<!-- -->
        glog.Warningf("jpeg compress failed,err:%v",err)
        return data
    }
    // 修改图片的大小
    m := resize.Resize(0, MaxHeight, img, resize.Lanczos3)
    buf := bytes.Buffer{<!-- -->}

    // 修改图片的质量
    err = jpeg.Encode(&buf, m, &jpeg.Options{<!-- -->Quality: 60})
    if err != nil {<!-- -->
        glog.Warningf("jpeg compress failed,err:%v",err)
        return data
    }
    if buf.Len() > len(data) {<!-- -->
        return data
    }
    return buf.Bytes()
}