Browse Source

add png compression level encode option

Grigory Dryapak 7 years ago
parent
commit
fd34ef7671
2 changed files with 26 additions and 9 deletions
  1. 24 9
      helpers.go
  2. 2 0
      helpers_test.go

+ 24 - 9
helpers.go

@@ -80,17 +80,19 @@ func Open(filename string) (image.Image, error) {
 }
 
 type encodeConfig struct {
-	jpegQuality  int
-	gifNumColors int
-	gifQuantizer draw.Quantizer
-	gifDrawer    draw.Drawer
+	jpegQuality         int
+	gifNumColors        int
+	gifQuantizer        draw.Quantizer
+	gifDrawer           draw.Drawer
+	pngCompressionLevel png.CompressionLevel
 }
 
 var defaultEncodeConfig = encodeConfig{
-	jpegQuality:  95,
-	gifNumColors: 256,
-	gifQuantizer: nil,
-	gifDrawer:    nil,
+	jpegQuality:         95,
+	gifNumColors:        256,
+	gifQuantizer:        nil,
+	gifDrawer:           nil,
+	pngCompressionLevel: png.DefaultCompression,
 }
 
 // EncodeOption sets an optional parameter for the Encode and Save functions.
@@ -128,6 +130,14 @@ func GIFDrawer(drawer draw.Drawer) EncodeOption {
 	}
 }
 
+// PNGCompressionLevel returns an EncodeOption that sets the compression level
+// of the PNG-encoded image. Default is png.DefaultCompression.
+func PNGCompressionLevel(level png.CompressionLevel) EncodeOption {
+	return func(c *encodeConfig) {
+		c.pngCompressionLevel = level
+	}
+}
+
 // Encode writes the image img to w in the specified format (JPEG, PNG, GIF, TIFF or BMP).
 func Encode(w io.Writer, img image.Image, format Format, opts ...EncodeOption) error {
 	cfg := defaultEncodeConfig
@@ -155,17 +165,22 @@ func Encode(w io.Writer, img image.Image, format Format, opts ...EncodeOption) e
 		}
 
 	case PNG:
-		err = png.Encode(w, img)
+		enc := png.Encoder{CompressionLevel: cfg.pngCompressionLevel}
+		err = enc.Encode(w, img)
+
 	case GIF:
 		err = gif.Encode(w, img, &gif.Options{
 			NumColors: cfg.gifNumColors,
 			Quantizer: cfg.gifQuantizer,
 			Drawer:    cfg.gifDrawer,
 		})
+
 	case TIFF:
 		err = tiff.Encode(w, img, &tiff.Options{Compression: tiff.Deflate, Predictor: true})
+
 	case BMP:
 		err = bmp.Encode(w, img)
+
 	default:
 		err = ErrUnsupportedFormat
 	}

+ 2 - 0
helpers_test.go

@@ -7,6 +7,7 @@ import (
 	"image/color"
 	"image/color/palette"
 	"image/draw"
+	"image/png"
 	"io"
 	"io/ioutil"
 	"os"
@@ -87,6 +88,7 @@ func TestOpenSave(t *testing.T) {
 			GIFDrawer(draw.FloydSteinberg),
 			GIFNumColors(256),
 			GIFQuantizer(quantizer{palette.Plan9}),
+			PNGCompressionLevel(png.BestSpeed),
 		},
 	}