From cf884f860c1400db9cd7175cad7befeac4046bae Mon Sep 17 00:00:00 2001 From: DarthSim Date: Tue, 7 Dec 2021 14:21:51 +0600 Subject: [PATCH] Improved ICC profiles handling --- CHANGELOG.md | 3 +++ processing/export_color_profile.go | 4 ---- processing/finalize.go | 8 -------- processing/import_color_profile.go | 2 +- processing/processing.go | 2 +- processing/watermark.go | 1 - vips/vips.c | 18 ++++++++---------- vips/vips.go | 4 ++++ 8 files changed, 17 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33dcb99b..343b1c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog ## [Unreleased] +### Change +- Improved ICC profiles handling. + ### Fix - (pro) Fix parsing metadata of extended sequential JPEGs. diff --git a/processing/export_color_profile.go b/processing/export_color_profile.go index d63d2cba..4323a370 100644 --- a/processing/export_color_profile.go +++ b/processing/export_color_profile.go @@ -31,10 +31,6 @@ func exportColorProfile(pctx *pipelineContext, img *vips.Image, po *options.Proc } } - if err := img.RgbColourspace(); err != nil { - return err - } - if !keepProfile { return img.RemoveColourProfile() } diff --git a/processing/finalize.go b/processing/finalize.go index 95bf6220..560a8064 100644 --- a/processing/finalize.go +++ b/processing/finalize.go @@ -7,14 +7,6 @@ import ( ) func finalize(pctx *pipelineContext, img *vips.Image, po *options.ProcessingOptions, imgdata *imagedata.ImageData) error { - if err := img.RgbColourspace(); err != nil { - return err - } - - if err := img.CastUchar(); err != nil { - return err - } - if po.StripMetadata { if err := img.Strip(); err != nil { return err diff --git a/processing/import_color_profile.go b/processing/import_color_profile.go index 871bf47a..1655424c 100644 --- a/processing/import_color_profile.go +++ b/processing/import_color_profile.go @@ -14,7 +14,7 @@ func importColorProfile(pctx *pipelineContext, img *vips.Image, po *options.Proc convertToLinear := config.UseLinearColorspace && (pctx.wscale != 1 || pctx.hscale != 1) - if convertToLinear { + if convertToLinear || img.IsCMYK() { if err := img.ImportColourProfile(); err != nil { return err } diff --git a/processing/processing.go b/processing/processing.go index 3b8324ce..8349e56e 100644 --- a/processing/processing.go +++ b/processing/processing.go @@ -27,12 +27,12 @@ var mainPipeline = pipeline{ rotateAndFlip, crop, fixWebpSize, - exportColorProfile, applyFilters, extend, padding, flatten, watermark, + exportColorProfile, finalize, } diff --git a/processing/watermark.go b/processing/watermark.go index f95fe5d1..6da183c1 100644 --- a/processing/watermark.go +++ b/processing/watermark.go @@ -16,7 +16,6 @@ var watermarkPipeline = pipeline{ importColorProfile, scale, rotateAndFlip, - exportColorProfile, finalize, } diff --git a/vips/vips.c b/vips/vips.c index d1ebc2d5..d409ae10 100644 --- a/vips/vips.c +++ b/vips/vips.c @@ -293,22 +293,22 @@ vips_has_embedded_icc(VipsImage *in) { int vips_icc_import_go(VipsImage *in, VipsImage **out) { - return vips_icc_import(in, out, "embedded", TRUE, "pcs", VIPS_PCS_XYZ, NULL); + return vips_icc_import(in, out, "embedded", TRUE, "pcs", VIPS_PCS_LAB, NULL); } int vips_icc_export_go(VipsImage *in, VipsImage **out) { - return vips_icc_export(in, out, NULL); + return vips_icc_export(in, out, "pcs", VIPS_PCS_LAB, NULL); } int vips_icc_export_srgb(VipsImage *in, VipsImage **out) { - return vips_icc_export(in, out, "output_profile", "sRGB", NULL); + return vips_icc_export(in, out, "output_profile", "sRGB", "pcs", VIPS_PCS_LAB, NULL); } int vips_icc_transform_go(VipsImage *in, VipsImage **out) { - return vips_icc_transform(in, out, "sRGB", "embedded", TRUE, "pcs", VIPS_PCS_XYZ, NULL); + return vips_icc_transform(in, out, "sRGB", "embedded", TRUE, "pcs", VIPS_PCS_LAB, NULL); } int @@ -456,15 +456,13 @@ vips_replicate_go(VipsImage *in, VipsImage **out, int width, int height) { int vips_embed_go(VipsImage *in, VipsImage **out, int x, int y, int width, int height) { - VipsImage *base = vips_image_new(); - VipsImage **t = (VipsImage **) vips_object_local_array(VIPS_OBJECT(base), 2); + VipsImage *tmp; int ret = - vips_colourspace(in, &t[0], VIPS_INTERPRETATION_sRGB, NULL) || - vips_ensure_alpha(t[0], &t[1]) || - vips_embed(t[1], out, x, y, width, height, "extend", VIPS_EXTEND_BLACK, NULL); + vips_ensure_alpha(in, &tmp) || + vips_embed(tmp, out, x, y, width, height, "extend", VIPS_EXTEND_BLACK, NULL); - clear_image(&base); + clear_image(&tmp); return ret; } diff --git a/vips/vips.go b/vips/vips.go index 9a8c5f48..14c2aa19 100644 --- a/vips/vips.go +++ b/vips/vips.go @@ -573,6 +573,10 @@ func (img *Image) Sharpen(sigma float32) error { return nil } +func (img *Image) IsCMYK() bool { + return C.vips_image_guess_interpretation(img.VipsImage) == C.VIPS_INTERPRETATION_CMYK +} + func (img *Image) ImportColourProfile() error { var tmp *C.VipsImage