add jxlsave tests
and revise colour encoding set see https://github.com/libvips/libvips/issues/2872
This commit is contained in:
parent
156e6a91e4
commit
c61b458904
@ -34,8 +34,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*/
|
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@ -360,11 +360,7 @@ vips_foreign_save_jxl_build( VipsObject *object )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the colour encoding. Either ICC based, or sRGB.
|
/* Set any ICC profile.
|
||||||
*
|
|
||||||
* libjxl will use linear 0 - 1 by default for float, so we
|
|
||||||
* don't need to call JxlColorEncodingSetToLinearSRGB() or
|
|
||||||
* JxlColorEncodingSetToSRGB().
|
|
||||||
*/
|
*/
|
||||||
if( vips_image_get_typeof( in, VIPS_META_ICC_NAME ) ) {
|
if( vips_image_get_typeof( in, VIPS_META_ICC_NAME ) ) {
|
||||||
const void *data;
|
const void *data;
|
||||||
@ -384,6 +380,34 @@ vips_foreign_save_jxl_build( VipsObject *object )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* If there's no ICC profile, we must set the colour encoding
|
||||||
|
* ourselves.
|
||||||
|
*/
|
||||||
|
if( in->Type == VIPS_INTERPRETATION_scRGB ) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf( "setting scRGB colourspace\n" );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
|
JxlColorEncodingSetToLinearSRGB( &jxl->color_encoding,
|
||||||
|
jxl->format.num_channels < 3 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf( "setting sRGB colourspace\n" );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
|
JxlColorEncodingSetToSRGB( &jxl->color_encoding,
|
||||||
|
jxl->format.num_channels < 3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( JxlEncoderSetColorEncoding( jxl->encoder,
|
||||||
|
&jxl->color_encoding ) ) {
|
||||||
|
vips_foreign_save_jxl_error( jxl,
|
||||||
|
"JxlEncoderSetColorEncoding" );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Render the entire image in memory. libjxl seems to be missing
|
/* Render the entire image in memory. libjxl seems to be missing
|
||||||
* tile-based write at the moment.
|
* tile-based write at the moment.
|
||||||
|
@ -1375,6 +1375,51 @@ class TestForeign:
|
|||||||
# im2 = pyvips.Image.new_from_buffer(buf, "")
|
# im2 = pyvips.Image.new_from_buffer(buf, "")
|
||||||
# assert (im == im2).min() == 255
|
# assert (im == im2).min() == 255
|
||||||
|
|
||||||
|
@skip_if_no("jxlsave")
|
||||||
|
def test_jxlsave(self):
|
||||||
|
# save and load with an icc profile
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
self.colour, 120)
|
||||||
|
|
||||||
|
# with no icc profile
|
||||||
|
no_profile = self.colour.copy()
|
||||||
|
no_profile.remove("icc-profile-data")
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
no_profile, 120)
|
||||||
|
|
||||||
|
# scrgb mode
|
||||||
|
scrgb = self.colour.colourspace("scrgb")
|
||||||
|
no_profile.remove("icc-profile-data")
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
scrgb, 120)
|
||||||
|
|
||||||
|
# scrgb mode, no profile
|
||||||
|
scrgb_no_profile = scrgb.copy()
|
||||||
|
scrgb_no_profile.remove("icc-profile-data")
|
||||||
|
no_profile.remove("icc-profile-data")
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
scrgb_no_profile, 120)
|
||||||
|
|
||||||
|
# 16-bit mode
|
||||||
|
rgb16 = self.colour.colourspace("rgb16")
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
rgb16, 30000)
|
||||||
|
|
||||||
|
# repeat for lossless mode
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
self.colour, 0, lossless=True)
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
no_profile, 0, lossless=True)
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
scrgb, 0, lossless=True)
|
||||||
|
self.save_load_buffer("jxlsave_buffer", "jxlload_buffer",
|
||||||
|
scrgb_no_profile, 0, lossless=True)
|
||||||
|
|
||||||
|
# lossy should be much smaller than lossless
|
||||||
|
lossy = self.colour.jxlsave_buffer()
|
||||||
|
lossless = self.colour.jxlsave_buffer(lossless=True)
|
||||||
|
assert len(lossy) < len(lossless) / 5
|
||||||
|
|
||||||
@skip_if_no("gifsave")
|
@skip_if_no("gifsave")
|
||||||
def test_gifsave(self):
|
def test_gifsave(self):
|
||||||
# Animated GIF round trip
|
# Animated GIF round trip
|
||||||
|
Loading…
Reference in New Issue
Block a user