Skip to content

Commit

Permalink
Support setting parameters in the encoder from the highlevel function.
Browse files Browse the repository at this point in the history
  • Loading branch information
fancycode committed Sep 4, 2024
1 parent a79acad commit 78d469d
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 10 deletions.
66 changes: 57 additions & 9 deletions encode_highlevel.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,60 @@ func imageFromYCbCr(i *image.YCbCr) (*Image, error) {
return out, nil
}

// EncoderParameterSetter is a function that can configure an encoder.
type EncoderParameterSetter func(encoder *Encoder) error

// SetEncoderQuality returns a function that sets the quality of an encoder.
func SetEncoderQuality(quality int) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetQuality(quality)
}
}

// SetEncoderLossless returns a function that sets the lossless mode of an encoder.
func SetEncoderLossless(lossless LosslessMode) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetLossless(lossless)
}
}

// SetEncoderLoggingLevel returns a function that sets the logging level of an encoder.
func SetEncoderLoggingLevel(level LoggingLevel) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetLoggingLevel(level)
}
}

// SetEncoderParameterBool returns a function that sets a boolean parameter in an encoder.
func SetEncoderParameterBool(name string, value bool) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetParameterBool(name, value)
}
}

// SetEncoderParameterInteger returns a function that sets an integer parameter in an encoder.
func SetEncoderParameterInteger(name string, value int) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetParameterInteger(name, value)
}
}

// SetEncoderParameterString returns a function that sets a string parameter in an encoder.
func SetEncoderParameterString(name string, value string) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetParameterString(name, value)
}
}

// SetEncoderParameter returns a function that sets an arbitrary parameter in an encoder.
func SetEncoderParameter(name string, value string) EncoderParameterSetter {
return func(encoder *Encoder) error {
return encoder.SetParameter(name, value)
}
}

// EncodeFromImage is a high-level function to encode a Go Image to a new Context.
func EncodeFromImage(img image.Image, compression CompressionFormat, quality int, lossless LosslessMode, logging LoggingLevel) (*Context, error) {
func EncodeFromImage(img image.Image, compression CompressionFormat, params ...EncoderParameterSetter) (*Context, error) {
if err := checkLibraryVersion(); err != nil {
return nil, err
}
Expand Down Expand Up @@ -253,14 +305,10 @@ func EncodeFromImage(img image.Image, compression CompressionFormat, quality int
return nil, fmt.Errorf("failed to create encoder: %v", err)
}

if err := enc.SetQuality(quality); err != nil {
return nil, fmt.Errorf("failed to set quality: %v", err)
}
if err := enc.SetLossless(lossless); err != nil {
return nil, fmt.Errorf("failed to set lossless mode: %v", err)
}
if err := enc.SetLoggingLevel(logging); err != nil {
return nil, fmt.Errorf("failed to set logging level: %v", err)
for _, param := range params {
if err := param(enc); err != nil {
return nil, fmt.Errorf("error setting parameter: %w", err)
}
}

encOpts, err := NewEncodingOptions()
Expand Down
6 changes: 5 additions & 1 deletion encoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ func TestEncoder(t *testing.T) {
require.True(HaveEncoderForFormat(codec))

img := loadImage(t, "testdata/example-1.jpg")
ctx, err := EncodeFromImage(img, codec, 75, LosslessModeDisabled, LoggingLevelFull)
ctx, err := EncodeFromImage(img, codec,
SetEncoderQuality(75),
SetEncoderLossless(LosslessModeDisabled),
SetEncoderLoggingLevel(LoggingLevelFull),
)
require.NoError(err)

output := path.Join(outdir, "example-1."+ext)
Expand Down

0 comments on commit 78d469d

Please sign in to comment.