@@ -2,14 +2,11 @@ package png
22
33import (
44 "bytes"
5- "github.com/foobaz/lossypng/lossypng"
65 "image"
76 "image/png"
87 "io"
98)
109
11- const qMax = 20
12-
1310// Options represent PNG encoding options.
1411type Options struct {
1512 Quality int `json:"quality"`
@@ -25,15 +22,23 @@ func DecodePNG(r io.Reader) (image.Image, error) {
2522}
2623
2724// EncodePNG encodes an image into PNG and returns a buffer.
25+ // Lossless compression is used; the Quality option controls the compression
26+ // level (higher quality = less compression effort = faster encode).
2827func EncodePNG (i image.Image , o * Options ) (buf bytes.Buffer , err error ) {
29- c := lossypng . Compress ( i , 2 , qualityFactor (o .Quality ))
30- err = png .Encode (& buf , c )
28+ enc := & png. Encoder { CompressionLevel : compressionLevel (o .Quality )}
29+ err = enc .Encode (& buf , i )
3130 return buf , err
3231}
3332
34- // qualityFactor normalizes the PNG quality factor from a max of 20, where 0 is
35- // no conversion.
36- func qualityFactor (q int ) int {
37- f := q / 100
38- return qMax - (f * qMax )
33+ // compressionLevel maps a quality value (0–100) to a png.CompressionLevel.
34+ // Lower quality = more aggressive compression (smaller file, slower encode).
35+ func compressionLevel (q int ) png.CompressionLevel {
36+ switch {
37+ case q >= 80 :
38+ return png .BestSpeed
39+ case q >= 40 :
40+ return png .DefaultCompression
41+ default :
42+ return png .BestCompression
43+ }
3944}
0 commit comments