drop incompatible profiles from save
libpng has started throwing hard errors if the profile does not match the image -- this can happen all the time with perofiles inherited from images that have been processed. Test profiles before save and drop them (with a warning) if they are incompatible with the image.
This commit is contained in:
parent
85615a7fbd
commit
e686614f2c
@ -9,6 +9,7 @@
|
|||||||
- add vips_rotate() ... a convenience method for vips_similarity()
|
- add vips_rotate() ... a convenience method for vips_similarity()
|
||||||
- svgload was missing is_a [lovell]
|
- svgload was missing is_a [lovell]
|
||||||
- better header sniffing for small files
|
- better header sniffing for small files
|
||||||
|
- drop incompatible ICC profiles before save
|
||||||
|
|
||||||
12/3/18 started 8.6.4
|
12/3/18 started 8.6.4
|
||||||
- better fitting of fonts with overhanging edges, thanks Adrià
|
- better fitting of fonts with overhanging edges, thanks Adrià
|
||||||
|
@ -1226,6 +1226,36 @@ vips_icc_ac2rc( VipsImage *in, VipsImage **out, const char *profile_filename )
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TRUE if a profile is compatible with an image.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
vips_icc_is_compatible_profile( VipsImage *image,
|
||||||
|
void *data, size_t data_length )
|
||||||
|
{
|
||||||
|
cmsHPROFILE profile;
|
||||||
|
|
||||||
|
if( !(profile = cmsOpenProfileFromMem( data, data_length )) ) {
|
||||||
|
g_warning( "%s", _( "corrupt profile" ) );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( vips_image_expected_bands( image ) !=
|
||||||
|
vips_icc_profile_needs_bands( profile ) ) {
|
||||||
|
VIPS_FREEF( cmsCloseProfile, profile );
|
||||||
|
g_warning( "%s",
|
||||||
|
_( "profile incompatible with image" ) );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
if( vips_image_expected_sig( image ) != cmsGetColorSpace( profile ) ) {
|
||||||
|
VIPS_FREEF( cmsCloseProfile, profile );
|
||||||
|
g_warning( "%s",
|
||||||
|
_( "profile colourspace differs from image" ) );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
#else /*!HAVE_LCMS2*/
|
#else /*!HAVE_LCMS2*/
|
||||||
|
|
||||||
#include <vips/vips.h>
|
#include <vips/vips.h>
|
||||||
@ -1245,6 +1275,13 @@ vips_icc_ac2rc( VipsImage *in, VipsImage **out, const char *profile_filename )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
vips_icc_is_compatible_profile( VipsImage *image,
|
||||||
|
void *data, size_t data_length )
|
||||||
|
{
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
#endif /*HAVE_LCMS*/
|
#endif /*HAVE_LCMS*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
* - META_SEQ support moved here
|
* - META_SEQ support moved here
|
||||||
* 5/3/18
|
* 5/3/18
|
||||||
* - block _start if one start fails, see #893
|
* - block _start if one start fails, see #893
|
||||||
|
* 1/4/18
|
||||||
|
* - drop incompatible ICC profiles before save
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1504,6 +1506,21 @@ vips__foreign_convert_saveable( VipsImage *in, VipsImage **ready,
|
|||||||
in = out;
|
in = out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Some format libraries, like libpng, will throw a hard error if the
|
||||||
|
* profile is inappropriate for this image type. With profiles inherited
|
||||||
|
* from a source image, this can happen all the time, so we
|
||||||
|
* want to just drop the profile in this case.
|
||||||
|
*/
|
||||||
|
if( vips_image_get_typeof( in, VIPS_META_ICC_NAME ) ) {
|
||||||
|
void *data;
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
if( !vips_image_get_blob( in, VIPS_META_ICC_NAME,
|
||||||
|
&data, &length ) &&
|
||||||
|
!vips_icc_is_compatible_profile( in, data, length ) )
|
||||||
|
vips_image_remove( in, VIPS_META_ICC_NAME );
|
||||||
|
}
|
||||||
|
|
||||||
*ready = in;
|
*ready = in;
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
@ -992,7 +992,8 @@ write_vips( Write *write,
|
|||||||
/* If we're an intel byte order CPU and this is a 16bit image, we need
|
/* If we're an intel byte order CPU and this is a 16bit image, we need
|
||||||
* to swap bytes.
|
* to swap bytes.
|
||||||
*/
|
*/
|
||||||
if( bit_depth > 8 && !vips_amiMSBfirst() )
|
if( bit_depth > 8 &&
|
||||||
|
!vips_amiMSBfirst() )
|
||||||
png_set_swap( write->pPng );
|
png_set_swap( write->pPng );
|
||||||
|
|
||||||
if( interlace )
|
if( interlace )
|
||||||
|
@ -177,6 +177,8 @@ int vips_icc_export( VipsImage *in, VipsImage **out, ... )
|
|||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
int vips_icc_ac2rc( VipsImage *in, VipsImage **out,
|
int vips_icc_ac2rc( VipsImage *in, VipsImage **out,
|
||||||
const char *profile_filename );
|
const char *profile_filename );
|
||||||
|
gboolean vips_icc_is_compatible_profile( VipsImage *image,
|
||||||
|
void *data, size_t data_length );
|
||||||
|
|
||||||
int vips_dE76( VipsImage *left, VipsImage *right, VipsImage **out, ... )
|
int vips_dE76( VipsImage *left, VipsImage *right, VipsImage **out, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
|
Loading…
Reference in New Issue
Block a user