mirror of
https://github.com/talgo-cloud/bimg.git
synced 2026-03-17 19:26:35 -07:00
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
This commit is contained in:
parent
ce7bbda0f5
commit
767bfdac74
4 changed files with 22 additions and 1 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
15
vips.go
15
vips.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
6
vips.h
6
vips.h
|
|
@ -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…
Add table
Add a link
Reference in a new issue