resources/images: Allow to set background fill colour

Closes #6298
This commit is contained in:
Bjørn Erik Pedersen
2019-10-20 10:39:00 +02:00
parent 689f647baf
commit 4b286b9d27
15 changed files with 356 additions and 45 deletions

View File

@@ -51,11 +51,8 @@ func NewImage(f Format, proc *ImageProcessor, img image.Image, s Spec) *Image {
type Image struct {
Format Format
Proc *ImageProcessor
Spec Spec
Proc *ImageProcessor
Spec Spec
*imageConfig
}
@@ -158,8 +155,8 @@ func (i *Image) initConfig() error {
return nil
}
func NewImageProcessor(cfg Imaging) (*ImageProcessor, error) {
e := cfg.Exif
func NewImageProcessor(cfg ImagingConfig) (*ImageProcessor, error) {
e := cfg.Cfg.Exif
exifDecoder, err := exif.NewDecoder(
exif.WithDateDisabled(e.DisableDate),
exif.WithLatLongDisabled(e.DisableLatLong),
@@ -179,7 +176,7 @@ func NewImageProcessor(cfg Imaging) (*ImageProcessor, error) {
}
type ImageProcessor struct {
Cfg Imaging
Cfg ImagingConfig
exifDecoder *exif.Decoder
}
@@ -218,7 +215,12 @@ func (p *ImageProcessor) ApplyFiltersFromConfig(src image.Image, conf ImageConfi
return nil, errors.Errorf("unsupported action: %q", conf.Action)
}
return p.Filter(src, filters...)
img, err := p.Filter(src, filters...)
if err != nil {
return nil, err
}
return img, nil
}
func (p *ImageProcessor) Filter(src image.Image, filters ...gift.Filter) (image.Image, error) {
@@ -231,7 +233,7 @@ func (p *ImageProcessor) Filter(src image.Image, filters ...gift.Filter) (image.
func (p *ImageProcessor) GetDefaultImageConfig(action string) ImageConfig {
return ImageConfig{
Action: action,
Quality: p.Cfg.Quality,
Quality: p.Cfg.Cfg.Quality,
}
}
@@ -256,6 +258,11 @@ func (f Format) RequiresDefaultQuality() bool {
return f == JPEG
}
// SupportsTransparency reports whether it supports transparency in any form.
func (f Format) SupportsTransparency() bool {
return f != JPEG
}
// DefaultExtension returns the default file extension of this format, starting with a dot.
// For example: .jpg for JPEG
func (f Format) DefaultExtension() string {
@@ -307,3 +314,15 @@ func ToFilters(in interface{}) []gift.Filter {
panic(fmt.Sprintf("%T is not an image filter", in))
}
}
// IsOpaque returns false if the image has alpha channel and there is at least 1
// pixel that is not (fully) opaque.
func IsOpaque(img image.Image) bool {
if oim, ok := img.(interface {
Opaque() bool
}); ok {
return oim.Opaque()
}
return false
}