起因

最近在处理一个需求,需要将 png 图像按比例调整图像尺寸,要求在保证图像质量的情况下尽量缩小文件大小。在本篇文章主要介绍我将 png 文件大小缩小使用的方法。

方法

这个需求缩小图像的尺寸很好解决,但缩小后的图像大小不尽人意,缩小的图像文件大小没有变化过多,甚至更大。我通过查询,发现了一种方法,就是先将图片转换为 jpeg 格式,再进行压缩后转换为 png 即可。

Jpeg的图片压缩是很好做的,因为jpeg这个协议本身就支持调整图片质量的。在golang中,我们只需要使用标准库的image/jpeg,将图片从二进制数据解码后,降低质量再编码为二进制数据即可实现压缩。而且质量和压缩比例相对而言还不错。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func compressImageResource(data []byte) []byte {
    imgSrc, _, err := image.Decode(bytes.NewReader(data))
    if err != nil {
    return data
    }
    newImg := image.NewRGBA(imgSrc.Bounds())
    draw.Draw(newImg, newImg.Bounds(), &image.Uniform{C: color.White}, image.Point{}, draw.Src)
    draw.Draw(newImg, newImg.Bounds(), imgSrc, imgSrc.Bounds().Min, draw.Over)
    buf := bytes.Buffer{}
    err = jpeg.Encode(&buf, newImg, &jpeg.Options{Quality: 40})
    if err != nil {
    return data
    }
    if buf.Len() > len(data) {
    return data
    }
    return buf.Bytes()
}

小结

本文主要介绍了将 png 图像大小缩小的一种简单方法,还有其他方法等待你们的发掘。