Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/processor/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ const (
ExtensionPNG = "png"
ExtensionJPG = "jpg"
ExtensionJPEG = "jpeg"
ExtensionGIF = "gif"
)
21 changes: 21 additions & 0 deletions pkg/processor/native/encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"errors"
"image"
"image/gif"
"image/jpeg"
"image/png"

Expand Down Expand Up @@ -31,6 +32,10 @@ type WebPEncoder struct {
Option *webp.Options
}

type GifEncoder struct {
Option *gif.Options
}

// NopEncoder is a no-op encoder object for unsupported format and will return error
type NopEncoder struct{}

Expand All @@ -52,6 +57,12 @@ func (e *WebPEncoder) Encode(img image.Image) ([]byte, error) {
return buff.Bytes(), err
}

func (e *GifEncoder) Encode(img image.Image) ([]byte, error) {
buff := &bytes.Buffer{}
err := gif.Encode(buff, img, nil)
return buff.Bytes(), err
}

func (e *NopEncoder) Encode(img image.Image) ([]byte, error) {
return nil, errors.New("unknown format: failed to encode image")
}
Expand All @@ -62,6 +73,7 @@ type Encoders struct {
pngEncoder *PngEncoder
noOpEncoder *NopEncoder
webPEncoder *WebPEncoder
gifEncoder *GifEncoder
}

// EncodersOption represents builder function for Encoders
Expand All @@ -79,6 +91,8 @@ func (e *Encoders) GetEncoder(img image.Image, ext string) Encoder {
return e.pngEncoder
case processor.ExtensionWebP:
return e.webPEncoder
case processor.ExtensionGIF:
return e.gifEncoder
default:
return e.noOpEncoder
}
Expand All @@ -105,13 +119,20 @@ func WithWebPEncoder(webPEncoder *WebPEncoder) EncodersOption {
}
}

func WithGifEncoder(gifEncoder *GifEncoder) EncodersOption {
return func(e *Encoders) {
e.gifEncoder = gifEncoder
}
}

// NewEncoders creates a new Encoders, if called without parameter (builder), all encoders option will be default
func NewEncoders(opts ...EncodersOption) *Encoders {
e := &Encoders{
jpegEncoder: &JpegEncoder{Option: &jpeg.Options{Quality: jpeg.DefaultQuality}},
pngEncoder: &PngEncoder{
Encoder: &png.Encoder{CompressionLevel: png.BestCompression},
},
gifEncoder: &GifEncoder{},
noOpEncoder: &NopEncoder{},
webPEncoder: &WebPEncoder{},
}
Expand Down
13 changes: 13 additions & 0 deletions pkg/processor/native/encoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ func (s *EncoderSuite) TestEncoders_GetEncoder_GivenWebPExtensionShouldReturnWeb
assert.IsType(s.T(), &WebPEncoder{}, s.encoders.GetEncoder(s.transparentImage, "webp"))
}

func (s *EncoderSuite) TestEncoders_GetEncoder_GivenGifExtensionShouldReturnGifEncoder() {
assert.IsType(s.T(), &GifEncoder{}, s.encoders.GetEncoder(s.srcImage, "gif"))
}

func (s *EncoderSuite) TestJpgEncoder_Encode_ShouldEncodeToJpeg() {
encoder := JpegEncoder{Option: nil}
data, err := encoder.Encode(s.srcImage)
Expand Down Expand Up @@ -140,3 +144,12 @@ func (s *EncoderSuite) TestWebPEncoder_Encode_ShouldEncodeToWebP() {
assert.Nil(s.T(), err)
assert.Equal(s.T(), "webp", f)
}

func (s *EncoderSuite) TestGifEncoder_Encode_ShouldEncodeToGif() {
encoder := GifEncoder{}
data, err := encoder.Encode(s.srcImage)
assert.Nil(s.T(), err)
_, f, err := s.processor.Decode(data)
assert.Nil(s.T(), err)
assert.Equal(s.T(), "gif", f)
}
3 changes: 3 additions & 0 deletions pkg/processor/native/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import (
"image"
"image/color"
"image/draw"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"strings"

"github.com/anthonynsimon/bild/blur"
Expand Down