Add option to convert embedded ICC profiles

Set an bimg.Options OutputICC to an absolute path to the desired output ICC profile. If an embedded ICC profile is found in VipsImage, it is converted to the output ICC profile.
Fixes #50
master
Janis Meybohm 9 years ago
parent ce7bbda0f5
commit 767bfdac74

@ -215,4 +215,5 @@ type Options struct {
Interpretation Interpretation Interpretation Interpretation
GaussianBlur GaussianBlur GaussianBlur GaussianBlur
Sharpen Sharpen Sharpen Sharpen
OutputICC string
} }

@ -161,6 +161,7 @@ func saveImage(image *C.VipsImage, o Options) ([]byte, error) {
Interlace: o.Interlace, Interlace: o.Interlace,
NoProfile: o.NoProfile, NoProfile: o.NoProfile,
Interpretation: o.Interpretation, Interpretation: o.Interpretation,
OutputICC: o.OutputICC,
} }
// Finally get the resultant buffer // Finally get the resultant buffer
return vipsSave(image, saveOptions) return vipsSave(image, saveOptions)

@ -55,6 +55,7 @@ type vipsSaveOptions struct {
Type ImageType Type ImageType
Interlace bool Interlace bool
NoProfile bool NoProfile bool
OutputICC string // Absolute path to the output ICC profile
Interpretation Interpretation Interpretation Interpretation
} }
@ -362,6 +363,7 @@ func vipsFlattenBackground(image *C.VipsImage, background Color) (*C.VipsImage,
} }
func vipsPreSave(image *C.VipsImage, o *vipsSaveOptions) (*C.VipsImage, error) { func vipsPreSave(image *C.VipsImage, o *vipsSaveOptions) (*C.VipsImage, error) {
var outImage *C.VipsImage
// Remove ICC profile metadata // Remove ICC profile metadata
if o.NoProfile { if o.NoProfile {
C.remove_profile(image) C.remove_profile(image)
@ -374,7 +376,6 @@ func vipsPreSave(image *C.VipsImage, o *vipsSaveOptions) (*C.VipsImage, error) {
interpretation := C.VipsInterpretation(o.Interpretation) interpretation := C.VipsInterpretation(o.Interpretation)
// Apply the proper colour space // Apply the proper colour space
var outImage *C.VipsImage
if vipsColourspaceIsSupported(image) { if vipsColourspaceIsSupported(image) {
err := C.vips_colourspace_bridge(image, &outImage, interpretation) err := C.vips_colourspace_bridge(image, &outImage, interpretation)
if int(err) != 0 { if int(err) != 0 {
@ -383,6 +384,18 @@ func vipsPreSave(image *C.VipsImage, o *vipsSaveOptions) (*C.VipsImage, error) {
image = outImage image = outImage
} }
if o.OutputICC != "" && vipsHasProfile(image) {
debug("Embedded ICC profile found, trying to convert to %s", o.OutputICC)
outputIccPath := C.CString(o.OutputICC)
defer C.free(unsafe.Pointer(outputIccPath))
err := C.vips_icc_transform_bridge(image, &outImage, outputIccPath)
if int(err) != 0 {
return nil, catchVipsError()
}
image = outImage
}
return image, nil return image, nil
} }

@ -260,6 +260,12 @@ vips_colourspace_bridge(VipsImage *in, VipsImage **out, VipsInterpretation space
return vips_colourspace(in, out, space, NULL); return vips_colourspace(in, out, space, NULL);
} }
int
vips_icc_transform_bridge (VipsImage *in, VipsImage **out, const char *output_icc_profile) {
// `output_icc_profile` represents the absolute path to the output ICC profile file
return vips_icc_transform(in, out, output_icc_profile, "embedded", TRUE, NULL);
}
int int
vips_jpegsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int quality, int interlace) { vips_jpegsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int quality, int interlace) {
return vips_jpegsave_buffer(in, buf, len, return vips_jpegsave_buffer(in, buf, len,

Loading…
Cancel
Save