format_quality processing option

This commit is contained in:
DarthSim
2021-09-29 19:49:18 +06:00
parent 802fa43015
commit 70840467d0
4 changed files with 52 additions and 3 deletions

View File

@@ -79,6 +79,7 @@ type ProcessingOptions struct {
Rotate int
Format imagetype.Type
Quality int
FormatQuality map[imagetype.Type]int
MaxBytes int
Flatten bool
Background vips.Color
@@ -103,6 +104,8 @@ type ProcessingOptions struct {
Filename string
UsedPresets []string
defaultQuality int
}
var (
@@ -133,6 +136,9 @@ func NewProcessingOptions() *ProcessingOptions {
StripMetadata: config.StripMetadata,
StripColorProfile: config.StripColorProfile,
AutoRotate: config.AutoRotate,
// Basically, we need this to update ETag when `IMGPROXY_QUALITY` is changed
defaultQuality: config.Quality,
}
})
@@ -140,6 +146,11 @@ func NewProcessingOptions() *ProcessingOptions {
po.SkipProcessingFormats = append([]imagetype.Type(nil), config.SkipProcessingFormats...)
po.UsedPresets = make([]string, 0, len(config.Presets))
po.FormatQuality = make(map[imagetype.Type]int)
for k, v := range config.FormatQuality {
po.FormatQuality[k] = v
}
return &po
}
@@ -147,11 +158,11 @@ func (po *ProcessingOptions) GetQuality() int {
q := po.Quality
if q == 0 {
q = config.FormatQuality[po.Format]
q = po.FormatQuality[po.Format]
}
if q == 0 {
q = config.Quality
q = po.defaultQuality
}
return q
@@ -522,6 +533,28 @@ func applyQualityOption(po *ProcessingOptions, args []string) error {
return nil
}
func applyFormatQualityOption(po *ProcessingOptions, args []string) error {
argsLen := len(args)
if len(args)%2 != 0 {
return fmt.Errorf("Missing quality for: %s", args[argsLen-1])
}
for i := 0; i < argsLen; i += 2 {
f, ok := imagetype.Types[args[i]]
if !ok {
return fmt.Errorf("Invalid image format: %s", args[i])
}
if q, err := strconv.Atoi(args[i+1]); err == nil && q >= 0 && q <= 100 {
po.FormatQuality[f] = q
} else {
return fmt.Errorf("Invalid quality for %s: %s", args[i], args[i+1])
}
}
return nil
}
func applyMaxBytesOption(po *ProcessingOptions, args []string) error {
if len(args) > 1 {
return fmt.Errorf("Invalid max_bytes arguments: %v", args)
@@ -832,6 +865,8 @@ func applyURLOption(po *ProcessingOptions, name string, args []string) error {
// Saving options
case "quality", "q":
return applyQualityOption(po, args)
case "format_quality", "fq":
return applyFormatQualityOption(po, args)
case "max_bytes", "mb":
return applyMaxBytesOption(po, args)
case "format", "f", "ext":