From d883bb6fee66df895ebc7bf80ed6a4eb352ca1b9 Mon Sep 17 00:00:00 2001 From: Evan Oberholster Date: Sun, 4 Nov 2018 22:04:19 +0200 Subject: [PATCH] Update Transform ICC Profiles with Input Profile Support for input profile when there is none embbeded in image. --- options.go | 1 + resizer.go | 1 + vips.go | 35 ++++++++++++++++++++++++++++++++++- vips.h | 9 ++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/options.go b/options.go index 17a1cb4..270a11c 100644 --- a/options.go +++ b/options.go @@ -223,4 +223,5 @@ type Options struct { Sharpen Sharpen Threshold float64 OutputICC string + InputICC string } diff --git a/resizer.go b/resizer.go index 98a95ae..b84b4d0 100644 --- a/resizer.go +++ b/resizer.go @@ -161,6 +161,7 @@ func saveImage(image *C.VipsImage, o Options) ([]byte, error) { Interlace: o.Interlace, NoProfile: o.NoProfile, Interpretation: o.Interpretation, + InputICC: o.InputICC, OutputICC: o.OutputICC, StripMetadata: o.StripMetadata, Lossless: o.Lossless, diff --git a/vips.go b/vips.go index fb17901..b9884d3 100644 --- a/vips.go +++ b/vips.go @@ -52,6 +52,7 @@ type vipsSaveOptions struct { NoProfile bool StripMetadata bool Lossless bool + InputICC string // Absolute path to the input ICC profile OutputICC string // Absolute path to the output ICC profile Interpretation Interpretation } @@ -233,7 +234,7 @@ func vipsRotate(image *C.VipsImage, angle Angle) (*C.VipsImage, error) { var out *C.VipsImage defer C.g_object_unref(C.gpointer(image)) - err := C.vips_rotate(image, &out, C.int(angle)) + err := C.vips_rotate_bridge(image, &out, C.int(angle)) if err != 0 { return nil, catchVipsError() } @@ -241,6 +242,23 @@ func vipsRotate(image *C.VipsImage, angle Angle) (*C.VipsImage, error) { return out, nil } +func vipsTransformICC(image *C.VipsImage, inputICC string, outputICC string) (*C.VipsImage, error) { + var out *C.VipsImage + defer C.g_object_unref(C.gpointer(image)) + + outputIccPath := C.CString(outputICC) + defer C.free(unsafe.Pointer(outputIccPath)) + inputIccPath := C.CString(inputICC) + defer C.free(unsafe.Pointer(inputIccPath)) + err := C.vips_icc_transform_with_default_bridge(image, &out, outputIccPath, inputIccPath) + //err := C.vips_icc_transform_bridge2(image, &outImage, outputIccPath, inputIccPath) + if int(err) != 0 { + return nil, catchVipsError() + } + + return out, nil +} + func vipsFlip(image *C.VipsImage, direction Direction) (*C.VipsImage, error) { var out *C.VipsImage defer C.g_object_unref(C.gpointer(image)) @@ -381,6 +399,21 @@ func vipsPreSave(image *C.VipsImage, o *vipsSaveOptions) (*C.VipsImage, error) { image = outImage } + if o.OutputICC != "" && o.InputICC != "" { + outputIccPath := C.CString(o.OutputICC) + defer C.free(unsafe.Pointer(outputIccPath)) + + inputIccPath := C.CString(o.InputICC) + defer C.free(unsafe.Pointer(inputIccPath)) + + err := C.vips_icc_transform_with_default_bridge(image, &outImage, outputIccPath, inputIccPath) + if int(err) != 0 { + return nil, catchVipsError() + } + C.g_object_unref(C.gpointer(image)) + return outImage, nil + } + if o.OutputICC != "" && vipsHasProfile(image) { outputIccPath := C.CString(o.OutputICC) defer C.free(unsafe.Pointer(outputIccPath)) diff --git a/vips.h b/vips.h index 29a2e63..65e4331 100644 --- a/vips.h +++ b/vips.h @@ -177,7 +177,7 @@ vips_type_find_save_bridge(int t) { } int -vips_rotate(VipsImage *in, VipsImage **out, int angle) { +vips_rotate_bridge(VipsImage *in, VipsImage **out, int angle) { int rotate = VIPS_ANGLE_D0; angle %= 360; @@ -274,6 +274,13 @@ vips_icc_transform_bridge (VipsImage *in, VipsImage **out, const char *output_ic return vips_icc_transform(in, out, output_icc_profile, "embedded", TRUE, NULL); } + +int +vips_icc_transform_with_default_bridge (VipsImage *in, VipsImage **out, const char *output_icc_profile, const char *input_icc_profile) { + // `output_icc_profile` represents the absolute path to the output ICC profile file + return vips_icc_transform(in, out, output_icc_profile, "input_profile", input_icc_profile, "embedded", FALSE, NULL); +} + int vips_jpegsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int quality, int interlace) { return vips_jpegsave_buffer(in, buf, len,