1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-01-23 11:14:48 +02:00

IMGPROXY_ENFORCE_THUMBNAIL config & enforce_thumbnail option

This commit is contained in:
DarthSim 2022-04-14 22:32:40 +06:00
parent 9b146991c5
commit e1a69c5d95
6 changed files with 36 additions and 2 deletions

View File

@ -3,6 +3,7 @@
## [Unreleased] ## [Unreleased]
### Add ### Add
- Add support of RLE-encoded BMP. - Add support of RLE-encoded BMP.
- Add `IMGPROXY_ENFORCE_THUMBNAIL` config and [enforce_thumbnail](https://docs.imgproxy.net/generating_the_url?id=enforce-thumbnail) processing option.
### Change ### Change
- Use thumbnail embedded to HEIC/AVIF if its size is larger than or equal to the requested. - Use thumbnail embedded to HEIC/AVIF if its size is larger than or equal to the requested.

View File

@ -49,6 +49,7 @@ var (
StripMetadata bool StripMetadata bool
StripColorProfile bool StripColorProfile bool
AutoRotate bool AutoRotate bool
EnforceThumbnail bool
EnableWebpDetection bool EnableWebpDetection bool
EnforceWebp bool EnforceWebp bool
@ -204,6 +205,7 @@ func Reset() {
StripMetadata = true StripMetadata = true
StripColorProfile = true StripColorProfile = true
AutoRotate = true AutoRotate = true
EnforceThumbnail = false
EnableWebpDetection = false EnableWebpDetection = false
EnforceWebp = false EnforceWebp = false
@ -350,6 +352,7 @@ func Configure() error {
configurators.Bool(&StripMetadata, "IMGPROXY_STRIP_METADATA") configurators.Bool(&StripMetadata, "IMGPROXY_STRIP_METADATA")
configurators.Bool(&StripColorProfile, "IMGPROXY_STRIP_COLOR_PROFILE") configurators.Bool(&StripColorProfile, "IMGPROXY_STRIP_COLOR_PROFILE")
configurators.Bool(&AutoRotate, "IMGPROXY_AUTO_ROTATE") configurators.Bool(&AutoRotate, "IMGPROXY_AUTO_ROTATE")
configurators.Bool(&EnforceThumbnail, "IMGPROXY_ENFORCE_THUMBNAIL")
configurators.Bool(&EnableWebpDetection, "IMGPROXY_ENABLE_WEBP_DETECTION") configurators.Bool(&EnableWebpDetection, "IMGPROXY_ENABLE_WEBP_DETECTION")
configurators.Bool(&EnforceWebp, "IMGPROXY_ENFORCE_WEBP") configurators.Bool(&EnforceWebp, "IMGPROXY_ENFORCE_WEBP")

View File

@ -417,5 +417,6 @@ imgproxy can send logs to syslog, but this feature is disabled by default. To en
* `IMGPROXY_STRIP_METADATA`: when `true`, imgproxy will strip all metadata (EXIF, IPTC, etc.) from JPEG and WebP output images. Default: `true` * `IMGPROXY_STRIP_METADATA`: when `true`, imgproxy will strip all metadata (EXIF, IPTC, etc.) from JPEG and WebP output images. Default: `true`
* `IMGPROXY_STRIP_COLOR_PROFILE`: when `true`, imgproxy will transform the embedded color profile (ICC) to sRGB and remove it from the image. Otherwise, imgproxy will try to keep it as is. Default: `true` * `IMGPROXY_STRIP_COLOR_PROFILE`: when `true`, imgproxy will transform the embedded color profile (ICC) to sRGB and remove it from the image. Otherwise, imgproxy will try to keep it as is. Default: `true`
* `IMGPROXY_AUTO_ROTATE`: when `true`, imgproxy will automatically rotate images based on the EXIF Orientation parameter (if available in the image meta data). The orientation tag will be removed from the image in all cases. Default: `true` * `IMGPROXY_AUTO_ROTATE`: when `true`, imgproxy will automatically rotate images based on the EXIF Orientation parameter (if available in the image meta data). The orientation tag will be removed from the image in all cases. Default: `true`
* `IMGPROXY_ENFORCE_THUMBNAIL`: when `true` and the source image has an embedded thumbnail, imgproxy will always use the embedded thumbnail instead on the main image. Currently, only thumbnails embedded in `heic` and `avif` are supported. Default: `false`
* `IMGPROXY_HEALTH_CHECK_MESSAGE`: <i class='badge badge-pro'></i> the content of the health check response. Default: `imgproxy is running` * `IMGPROXY_HEALTH_CHECK_MESSAGE`: <i class='badge badge-pro'></i> the content of the health check response. Default: `imgproxy is running`
* `IMGPROXY_HEALTH_CHECK_PATH`: an additional path of the health check. Default: blank * `IMGPROXY_HEALTH_CHECK_PATH`: an additional path of the health check. Default: blank

View File

@ -511,6 +511,15 @@ scp:%strip_color_profile
When set to `1`, `t` or `true`, imgproxy will transform the embedded color profile (ICC) to sRGB and remove it from the image. Otherwise, imgproxy will try to keep it as is. This is normally controlled by the [IMGPROXY_STRIP_COLOR_PROFILE](configuration.md#miscellaneous) configuration but this procesing option allows the configuration to be set for each request. When set to `1`, `t` or `true`, imgproxy will transform the embedded color profile (ICC) to sRGB and remove it from the image. Otherwise, imgproxy will try to keep it as is. This is normally controlled by the [IMGPROXY_STRIP_COLOR_PROFILE](configuration.md#miscellaneous) configuration but this procesing option allows the configuration to be set for each request.
### Enforce thumbnail
```
enforce_thumbnail:%enforce_thumbnail
eth:%enforce_thumbnail
```
When set to `1`, `t` or `true` and the source image has an embedded thumbnail, imgproxy will always use the embedded thumbnail instead on the main image. Currently, only thumbnails embedded in `heic` and `avif` are supported. This is normally controlled by the [IMGPROXY_ENFORCE_THUMBNAIL](configuration.md#miscellaneous) configuration but this procesing option allows the configuration to be set for each request.
### Quality ### Quality
``` ```

View File

@ -87,6 +87,7 @@ type ProcessingOptions struct {
StripMetadata bool StripMetadata bool
StripColorProfile bool StripColorProfile bool
AutoRotate bool AutoRotate bool
EnforceThumbnail bool
SkipProcessingFormats []imagetype.Type SkipProcessingFormats []imagetype.Type
@ -136,6 +137,7 @@ func NewProcessingOptions() *ProcessingOptions {
StripMetadata: config.StripMetadata, StripMetadata: config.StripMetadata,
StripColorProfile: config.StripColorProfile, StripColorProfile: config.StripColorProfile,
AutoRotate: config.AutoRotate, AutoRotate: config.AutoRotate,
EnforceThumbnail: config.EnforceThumbnail,
// Basically, we need this to update ETag when `IMGPROXY_QUALITY` is changed // Basically, we need this to update ETag when `IMGPROXY_QUALITY` is changed
defaultQuality: config.Quality, defaultQuality: config.Quality,
@ -835,6 +837,16 @@ func applyAutoRotateOption(po *ProcessingOptions, args []string) error {
return nil return nil
} }
func applyEnforceThumbnailOption(po *ProcessingOptions, args []string) error {
if len(args) > 1 {
return fmt.Errorf("Invalid enforce thumbnail arguments: %v", args)
}
po.EnforceThumbnail = parseBoolOption(args[0])
return nil
}
func applyURLOption(po *ProcessingOptions, name string, args []string) error { func applyURLOption(po *ProcessingOptions, name string, args []string) error {
switch name { switch name {
case "resize", "rs": case "resize", "rs":
@ -885,6 +897,8 @@ func applyURLOption(po *ProcessingOptions, name string, args []string) error {
return applyStripMetadataOption(po, args) return applyStripMetadataOption(po, args)
case "strip_color_profile", "scp": case "strip_color_profile", "scp":
return applyStripColorProfileOption(po, args) return applyStripColorProfileOption(po, args)
case "enforce_thumbnail", "eth":
return applyEnforceThumbnailOption(po, args)
// Saving options // Saving options
case "quality", "q": case "quality", "q":
return applyQualityOption(po, args) return applyQualityOption(po, args)

View File

@ -239,9 +239,15 @@ func ProcessImage(ctx context.Context, imgdata *imagedata.ImageData, po *options
img := new(vips.Image) img := new(vips.Image)
defer img.Clear() defer img.Clear()
if po.EnforceThumbnail && imgdata.Type.SupportsThumbnail() {
if err := img.LoadThumbnail(imgdata); err != nil {
return nil, err
}
} else {
if err := img.Load(imgdata, 1, 1.0, pages); err != nil { if err := img.Load(imgdata, 1, 1.0, pages); err != nil {
return nil, err return nil, err
} }
}
originWidth, originHeight := getImageSize(img) originWidth, originHeight := getImageSize(img)