mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-10 20:22:31 +02:00
Add ENV setting for AVIF speed parameter (#605)
* Add ENV setting for AVIF speed parameter * Add AVIF to image format docs * Only use Speed on supported VIPS version * Probably need the method signature in go to have speed
This commit is contained in:
@@ -225,6 +225,7 @@ type config struct {
|
|||||||
PngInterlaced bool
|
PngInterlaced bool
|
||||||
PngQuantize bool
|
PngQuantize bool
|
||||||
PngQuantizationColors int
|
PngQuantizationColors int
|
||||||
|
AvifSpeed int
|
||||||
Quality int
|
Quality int
|
||||||
FormatQuality map[imageType]int
|
FormatQuality map[imageType]int
|
||||||
GZipCompression int
|
GZipCompression int
|
||||||
@@ -324,6 +325,7 @@ var conf = config{
|
|||||||
SignatureSize: 32,
|
SignatureSize: 32,
|
||||||
PngQuantizationColors: 256,
|
PngQuantizationColors: 256,
|
||||||
Quality: 80,
|
Quality: 80,
|
||||||
|
AvifSpeed: 5,
|
||||||
FormatQuality: map[imageType]int{imageTypeAVIF: 50},
|
FormatQuality: map[imageType]int{imageTypeAVIF: 50},
|
||||||
StripMetadata: true,
|
StripMetadata: true,
|
||||||
StripColorProfile: true,
|
StripColorProfile: true,
|
||||||
@@ -380,6 +382,7 @@ func configure() error {
|
|||||||
|
|
||||||
strSliceEnvConfig(&conf.AllowedSources, "IMGPROXY_ALLOWED_SOURCES")
|
strSliceEnvConfig(&conf.AllowedSources, "IMGPROXY_ALLOWED_SOURCES")
|
||||||
|
|
||||||
|
intEnvConfig(&conf.AvifSpeed, "IMGPROXY_AVIF_SPEED")
|
||||||
boolEnvConfig(&conf.JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")
|
boolEnvConfig(&conf.JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")
|
||||||
boolEnvConfig(&conf.PngInterlaced, "IMGPROXY_PNG_INTERLACED")
|
boolEnvConfig(&conf.PngInterlaced, "IMGPROXY_PNG_INTERLACED")
|
||||||
boolEnvConfig(&conf.PngQuantize, "IMGPROXY_PNG_QUANTIZE")
|
boolEnvConfig(&conf.PngQuantize, "IMGPROXY_PNG_QUANTIZE")
|
||||||
@@ -559,6 +562,12 @@ func configure() error {
|
|||||||
return fmt.Errorf("Quality can't be greater than 100, now - %d\n", conf.Quality)
|
return fmt.Errorf("Quality can't be greater than 100, now - %d\n", conf.Quality)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if conf.AvifSpeed <= 0 {
|
||||||
|
return fmt.Errorf("Avif speed should be greater than 0, now - %d\n", conf.AvifSpeed)
|
||||||
|
} else if conf.AvifSpeed > 8 {
|
||||||
|
return fmt.Errorf("Avif speed can't be greater than 8, now - %d\n", conf.AvifSpeed)
|
||||||
|
}
|
||||||
|
|
||||||
if conf.GZipCompression < 0 {
|
if conf.GZipCompression < 0 {
|
||||||
return fmt.Errorf("GZip compression should be greater than or equal to 0, now - %d\n", conf.GZipCompression)
|
return fmt.Errorf("GZip compression should be greater than or equal to 0, now - %d\n", conf.GZipCompression)
|
||||||
} else if conf.GZipCompression > 9 {
|
} else if conf.GZipCompression > 9 {
|
||||||
|
@@ -130,6 +130,7 @@ imgproxy can use the `Accept` HTTP header to detect if the browser supports AVIF
|
|||||||
* `IMGPROXY_ENFORCE_WEBP`: enables WebP support detection and enforces WebP usage. If the browser supports WebP, it will be used as resulting format even if another extension is specified in the imgproxy URL.
|
* `IMGPROXY_ENFORCE_WEBP`: enables WebP support detection and enforces WebP usage. If the browser supports WebP, it will be used as resulting format even if another extension is specified in the imgproxy URL.
|
||||||
* `IMGPROXY_ENABLE_AVIF_DETECTION`: enables AVIF support detection. When the file extension is omitted in the imgproxy URL and browser supports AVIF, imgproxy will use it as the resulting format;
|
* `IMGPROXY_ENABLE_AVIF_DETECTION`: enables AVIF support detection. When the file extension is omitted in the imgproxy URL and browser supports AVIF, imgproxy will use it as the resulting format;
|
||||||
* `IMGPROXY_ENFORCE_AVIF`: enables AVIF support detection and enforces AVIF usage. If the browser supports AVIF, it will be used as resulting format even if another extension is specified in the imgproxy URL.
|
* `IMGPROXY_ENFORCE_AVIF`: enables AVIF support detection and enforces AVIF usage. If the browser supports AVIF, it will be used as resulting format even if another extension is specified in the imgproxy URL.
|
||||||
|
* `IMGPROXY_AVIF_SPEED`: controls the CPU effort spent improving compression. 0 slowest - 8 fastest. Default: `5`;
|
||||||
|
|
||||||
**📝Note:** imgproxy prefers AVIF over WebP. This means that if both AVIF and WebP detection/enforcement are enabled and the browser supports both of them, AVIF will be used.
|
**📝Note:** imgproxy prefers AVIF over WebP. This means that if both AVIF and WebP detection/enforcement are enabled and the browser supports both of them, AVIF will be used.
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@ At the moment, imgproxy supports only the most popular image formats:
|
|||||||
| PNG | `png` | Yes | Yes |
|
| PNG | `png` | Yes | Yes |
|
||||||
| JPEG | `jpg` | Yes | Yes |
|
| JPEG | `jpg` | Yes | Yes |
|
||||||
| WebP | `webp` | Yes | Yes |
|
| WebP | `webp` | Yes | Yes |
|
||||||
|
| AVIF | `avif` | Yes | Yes |
|
||||||
| GIF | `gif` | Yes | Yes |
|
| GIF | `gif` | Yes | Yes |
|
||||||
| ICO | `ico` | Yes | Yes |
|
| ICO | `ico` | Yes | Yes |
|
||||||
| SVG | `svg` | Yes | [See notes](#svg-support) |
|
| SVG | `svg` | Yes | [See notes](#svg-support) |
|
||||||
@@ -39,6 +40,10 @@ imgproxy reads some amount of bytes to check if the source image is SVG. By defa
|
|||||||
|
|
||||||
imgproxy supports HEIC only when using libvips 8.8.0+. Official imgproxy Docker image supports HEIC out of the box.
|
imgproxy supports HEIC only when using libvips 8.8.0+. Official imgproxy Docker image supports HEIC out of the box.
|
||||||
|
|
||||||
|
## AVIF support
|
||||||
|
|
||||||
|
imgproxy supports AVIF only when using libvips 8.9.0+ with compiled support for libheif + its supported encoder (rav1e, aom). Official imgproxy Docker image supports AVIF out of the box.
|
||||||
|
|
||||||
## BMP support
|
## BMP support
|
||||||
|
|
||||||
imgproxy supports BMP only when using libvips 8.7.0+ compiled with ImageMagick support. Official imgproxy Docker image supports ICO out of the box.
|
imgproxy supports BMP only when using libvips 8.7.0+ compiled with ImageMagick support. Official imgproxy Docker image supports ICO out of the box.
|
||||||
|
16
vips.c
16
vips.c
@@ -37,6 +37,11 @@
|
|||||||
#define VIPS_SUPPORT_AVIF \
|
#define VIPS_SUPPORT_AVIF \
|
||||||
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 9))
|
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 9))
|
||||||
|
|
||||||
|
#define VIPS_SUPPORT_AVIF_SPEED \
|
||||||
|
(VIPS_MAJOR_VERSION > 8 || \
|
||||||
|
(VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION > 10) || \
|
||||||
|
(VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 10 && VIPS_MICRO_VERSION >= 2))
|
||||||
|
|
||||||
#define VIPS_SUPPORT_COMPOSITE \
|
#define VIPS_SUPPORT_COMPOSITE \
|
||||||
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 6))
|
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 6))
|
||||||
|
|
||||||
@@ -258,6 +263,11 @@ vips_support_webp_animation() {
|
|||||||
return VIPS_SUPPORT_WEBP_ANIMATION;
|
return VIPS_SUPPORT_WEBP_ANIMATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
vips_support_avif_speed() {
|
||||||
|
return VIPS_SUPPORT_AVIF_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
vips_is_animated(VipsImage * in) {
|
vips_is_animated(VipsImage * in) {
|
||||||
return( vips_image_get_typeof(in, "page-height") != G_TYPE_INVALID &&
|
return( vips_image_get_typeof(in, "page-height") != G_TYPE_INVALID &&
|
||||||
@@ -703,9 +713,13 @@ vips_tiffsave_go(VipsImage *in, void **buf, size_t *len, int quality) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vips_avifsave_go(VipsImage *in, void **buf, size_t *len, int quality) {
|
vips_avifsave_go(VipsImage *in, void **buf, size_t *len, int quality, int speed) {
|
||||||
#if VIPS_SUPPORT_AVIF
|
#if VIPS_SUPPORT_AVIF
|
||||||
|
#if VIPS_SUPPORT_AVIF_SPEED
|
||||||
|
return vips_heifsave_buffer(in, buf, len, "Q", quality, "compression", VIPS_FOREIGN_HEIF_COMPRESSION_AV1, "speed", speed, NULL);
|
||||||
|
#else
|
||||||
return vips_heifsave_buffer(in, buf, len, "Q", quality, "compression", VIPS_FOREIGN_HEIF_COMPRESSION_AV1, NULL);
|
return vips_heifsave_buffer(in, buf, len, "Q", quality, "compression", VIPS_FOREIGN_HEIF_COMPRESSION_AV1, NULL);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
vips_error("vips_avifsave_go", "Saving AVIF is not supported (libvips 8.9+ reuired)");
|
vips_error("vips_avifsave_go", "Saving AVIF is not supported (libvips 8.9+ reuired)");
|
||||||
return 1;
|
return 1;
|
||||||
|
5
vips.go
5
vips.go
@@ -36,6 +36,7 @@ var vipsConf struct {
|
|||||||
PngInterlaced C.int
|
PngInterlaced C.int
|
||||||
PngQuantize C.int
|
PngQuantize C.int
|
||||||
PngQuantizationColors C.int
|
PngQuantizationColors C.int
|
||||||
|
AvifSpeed C.int
|
||||||
WatermarkOpacity C.double
|
WatermarkOpacity C.double
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +88,7 @@ func initVips() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vipsConf.PngQuantizationColors = C.int(conf.PngQuantizationColors)
|
vipsConf.PngQuantizationColors = C.int(conf.PngQuantizationColors)
|
||||||
|
vipsConf.AvifSpeed = C.int(conf.AvifSpeed)
|
||||||
vipsConf.WatermarkOpacity = C.double(conf.WatermarkOpacity)
|
vipsConf.WatermarkOpacity = C.double(conf.WatermarkOpacity)
|
||||||
|
|
||||||
if err := vipsLoadWatermark(); err != nil {
|
if err := vipsLoadWatermark(); err != nil {
|
||||||
@@ -200,7 +201,7 @@ func (img *vipsImage) Save(imgtype imageType, quality int) ([]byte, context.Canc
|
|||||||
case imageTypeGIF:
|
case imageTypeGIF:
|
||||||
err = C.vips_gifsave_go(img.VipsImage, &ptr, &imgsize)
|
err = C.vips_gifsave_go(img.VipsImage, &ptr, &imgsize)
|
||||||
case imageTypeAVIF:
|
case imageTypeAVIF:
|
||||||
err = C.vips_avifsave_go(img.VipsImage, &ptr, &imgsize, C.int(quality))
|
err = C.vips_avifsave_go(img.VipsImage, &ptr, &imgsize, C.int(quality), vipsConf.AvifSpeed)
|
||||||
case imageTypeBMP:
|
case imageTypeBMP:
|
||||||
err = C.vips_bmpsave_go(img.VipsImage, &ptr, &imgsize)
|
err = C.vips_bmpsave_go(img.VipsImage, &ptr, &imgsize)
|
||||||
case imageTypeTIFF:
|
case imageTypeTIFF:
|
||||||
|
4
vips.h
4
vips.h
@@ -47,6 +47,8 @@ VipsBandFormat vips_band_format(VipsImage *in);
|
|||||||
gboolean vips_support_webp_animation();
|
gboolean vips_support_webp_animation();
|
||||||
gboolean vips_is_animated(VipsImage * in);
|
gboolean vips_is_animated(VipsImage * in);
|
||||||
|
|
||||||
|
gboolean vips_support_avif_speed();
|
||||||
|
|
||||||
int vips_image_get_array_int_go(VipsImage *image, const char *name, int **out, int *n);
|
int vips_image_get_array_int_go(VipsImage *image, const char *name, int **out, int *n);
|
||||||
void vips_image_set_array_int_go(VipsImage *image, const char *name, const int *array, int n);
|
void vips_image_set_array_int_go(VipsImage *image, const char *name, const int *array, int n);
|
||||||
|
|
||||||
@@ -99,7 +101,7 @@ int vips_jpegsave_go(VipsImage *in, void **buf, size_t *len, int quality, int in
|
|||||||
int vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace, int quantize, int colors);
|
int vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace, int quantize, int colors);
|
||||||
int vips_webpsave_go(VipsImage *in, void **buf, size_t *len, int quality);
|
int vips_webpsave_go(VipsImage *in, void **buf, size_t *len, int quality);
|
||||||
int vips_gifsave_go(VipsImage *in, void **buf, size_t *len);
|
int vips_gifsave_go(VipsImage *in, void **buf, size_t *len);
|
||||||
int vips_avifsave_go(VipsImage *in, void **buf, size_t *len, int quality);
|
int vips_avifsave_go(VipsImage *in, void **buf, size_t *len, int quality, int speed);
|
||||||
int vips_bmpsave_go(VipsImage *in, void **buf, size_t *len);
|
int vips_bmpsave_go(VipsImage *in, void **buf, size_t *len);
|
||||||
int vips_tiffsave_go(VipsImage *in, void **buf, size_t *len, int quality);
|
int vips_tiffsave_go(VipsImage *in, void **buf, size_t *len, int quality);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user