1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-07-12 23:00:55 +02:00

Watermarking with vips_composite

This commit is contained in:
DarthSim
2019-09-11 15:45:11 +06:00
parent aa2e8bd90e
commit e3c461bc8a
2 changed files with 27 additions and 91 deletions

View File

@ -229,16 +229,10 @@ func prepareWatermark(wm *vipsImage, wmData *watermarkData, opts *watermarkOptio
} }
if opts.Replicate { if opts.Replicate {
if err := wm.Replicate(imgWidth, imgHeight); err != nil { return wm.Replicate(imgWidth, imgHeight)
return err
}
} else {
if err := wm.Embed(opts.Gravity, imgWidth, imgHeight, opts.OffsetX, opts.OffsetY, rgbColor{0, 0, 0}); err != nil {
return err
}
} }
return wm.CopyMemory() return wm.Embed(opts.Gravity, imgWidth, imgHeight, opts.OffsetX, opts.OffsetY, rgbColor{0, 0, 0})
} }
func applyWatermark(img *vipsImage, wmData *watermarkData, opts *watermarkOptions, framesCount int) error { func applyWatermark(img *vipsImage, wmData *watermarkData, opts *watermarkOptions, framesCount int) error {

108
vips.c
View File

@ -31,6 +31,9 @@
#define VIPS_SUPPORT_BUILTIN_ICC \ #define VIPS_SUPPORT_BUILTIN_ICC \
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8)) (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8))
#define VIPS_SUPPORT_COMPOSITE \
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 6))
#define EXIF_ORIENTATION "exif-ifd0-Orientation" #define EXIF_ORIENTATION "exif-ifd0-Orientation"
#if (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8)) #if (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8))
@ -387,99 +390,38 @@ vips_ensure_alpha(VipsImage *in, VipsImage **out) {
int int
vips_apply_watermark(VipsImage *in, VipsImage *watermark, VipsImage **out, double opacity) { vips_apply_watermark(VipsImage *in, VipsImage *watermark, VipsImage **out, double opacity) {
VipsImage *wm, *wm_alpha, *tmp; #ifdef VIPS_SUPPORT_COMPOSITE
VipsImage *base = vips_image_new();
if (vips_extract_band(watermark, &wm, 0, "n", watermark->Bands - 1, NULL)) VipsImage **t = (VipsImage **) vips_object_local_array(VIPS_OBJECT(base), 5);
return 1;
if (vips_extract_band(watermark, &wm_alpha, watermark->Bands - 1, "n", 1, NULL)) {
clear_image(&wm);
return 1;
}
VipsInterpretation img_interpolation = vips_image_guess_interpretation(in);
if (img_interpolation != vips_image_guess_interpretation(wm)) {
if (vips_colourspace(wm, &tmp, img_interpolation, NULL)) {
clear_image(&wm);
clear_image(&wm_alpha);
return 1;
}
swap_and_clear(&wm, tmp);
}
if (opacity < 1) { if (opacity < 1) {
if (vips_linear1(wm_alpha, &tmp, opacity, 0, NULL)) { if (
clear_image(&wm); vips_extract_band(watermark, &t[0], 0, "n", watermark->Bands - 1, NULL) ||
clear_image(&wm_alpha); vips_extract_band(watermark, &t[1], watermark->Bands - 1, "n", 1, NULL) ||
return 1; vips_linear1(t[1], &t[2], opacity, 0, NULL) ||
} vips_bandjoin2(t[0], t[2], &t[3], NULL)
) {
swap_and_clear(&wm_alpha, tmp); clear_image(&base);
}
VipsBandFormat img_format;
VipsImage *img, *img_alpha;
img_format = vips_image_get_format(in);
gboolean has_alpha = vips_image_hasalpha_go(in);
if (has_alpha) {
if (vips_extract_band(in, &img, 0, "n", in->Bands - 1, NULL)) {
clear_image(&wm);
clear_image(&wm_alpha);
return 1;
}
if (vips_extract_band(in, &img_alpha, in->Bands - 1, "n", 1, NULL)) {
clear_image(&wm);
clear_image(&wm_alpha);
clear_image(&img);
return 1; return 1;
} }
} else { } else {
if (vips_copy(in, &img, NULL)) { if (vips_copy(watermark, &t[3], NULL)) {
clear_image(&wm); clear_image(&base);
clear_image(&wm_alpha);
return 1; return 1;
} }
} }
if (vips_ifthenelse(wm_alpha, wm, img, &tmp, "blend", TRUE, NULL)) { int res =
clear_image(&wm); vips_composite2(in, t[3], &t[4], VIPS_BLEND_MODE_OVER, "compositing_space", in->Type, NULL) ||
clear_image(&wm_alpha); vips_cast(t[4], out, vips_image_get_format(in), NULL);
clear_image(&img);
clear_image(&img_alpha); clear_image(&base);
return res;
#else
vips_error("vips_apply_watermark", "Watermarking is not supported");
return 1; return 1;
} #endif
swap_and_clear(&img, tmp);
clear_image(&wm);
clear_image(&wm_alpha);
if (has_alpha) {
if (vips_bandjoin2(img, img_alpha, &tmp, NULL)) {
clear_image(&img);
clear_image(&img_alpha);
return 1;
}
swap_and_clear(&img, tmp);
clear_image(&img_alpha);
}
if (img_format != vips_image_get_format(img)) {
if (vips_cast(img, &tmp, img_format, NULL)) {
clear_image(&img);
return 1;
}
swap_and_clear(&img, tmp);
}
*out = img;
return 0;
} }
int int