better sanity checking for input profiles
previously it could get RGBA and CMYK images mixed up, see: https://github.com/lovell/sharp/issues/237
This commit is contained in:
parent
a812e90332
commit
6ffdc6a7b7
7
TODO
7
TODO
@ -1,4 +1,9 @@
|
|||||||
- fix up docs for HSV
|
- colour needs to split _build() into preprocess / process / postprocess
|
||||||
|
phases
|
||||||
|
|
||||||
|
in icc_import, for example, we want to check that the supplied profile is
|
||||||
|
compatible with the input image as it will be when unpacked and ready for
|
||||||
|
process_line
|
||||||
|
|
||||||
- how about something like vips_grid() which turns a tall thin one-band
|
- how about something like vips_grid() which turns a tall thin one-band
|
||||||
image into a much smaller many-band image?
|
image into a much smaller many-band image?
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
* 29/9/14
|
* 29/9/14
|
||||||
* - check input profiles for compatibility with the input image, thanks
|
* - check input profiles for compatibility with the input image, thanks
|
||||||
* James
|
* James
|
||||||
|
* 26/6/15
|
||||||
|
* - better profile sanity checking for icc import
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -489,6 +491,57 @@ vips_icc_profile_needs_bands( cmsHPROFILE profile )
|
|||||||
return( needs_bands );
|
return( needs_bands );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* How many bands we expect to see from an image after preprocessing by our
|
||||||
|
* parent classes. This is a bit fragile :-(
|
||||||
|
*
|
||||||
|
* FIXME ... split the _build() for colour into separate preprocess / process
|
||||||
|
* / postprocess phases so we can load profiles after preprocess but before
|
||||||
|
* actual processing takes place.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
vips_image_expected_bands( VipsImage *image )
|
||||||
|
{
|
||||||
|
int expected_bands;
|
||||||
|
|
||||||
|
switch( image->Bands ) {
|
||||||
|
case VIPS_INTERPRETATION_B_W:
|
||||||
|
case VIPS_INTERPRETATION_GREY16:
|
||||||
|
expected_bands = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIPS_INTERPRETATION_XYZ:
|
||||||
|
case VIPS_INTERPRETATION_LAB:
|
||||||
|
case VIPS_INTERPRETATION_LABQ:
|
||||||
|
case VIPS_INTERPRETATION_RGB:
|
||||||
|
case VIPS_INTERPRETATION_CMC:
|
||||||
|
case VIPS_INTERPRETATION_LCH:
|
||||||
|
case VIPS_INTERPRETATION_LABS:
|
||||||
|
case VIPS_INTERPRETATION_sRGB:
|
||||||
|
case VIPS_INTERPRETATION_YXY:
|
||||||
|
case VIPS_INTERPRETATION_RGB16:
|
||||||
|
case VIPS_INTERPRETATION_scRGB:
|
||||||
|
case VIPS_INTERPRETATION_HSV:
|
||||||
|
expected_bands = 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIPS_INTERPRETATION_CMYK:
|
||||||
|
expected_bands = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIPS_INTERPRETATION_MULTIBAND:
|
||||||
|
case VIPS_INTERPRETATION_HISTOGRAM:
|
||||||
|
case VIPS_INTERPRETATION_MATRIX:
|
||||||
|
case VIPS_INTERPRETATION_FOURIER:
|
||||||
|
default:
|
||||||
|
expected_bands = image->Bands;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
expected_bands = VIPS_MIN( expected_bands, image->Bands );
|
||||||
|
|
||||||
|
return( expected_bands );
|
||||||
|
}
|
||||||
|
|
||||||
static cmsHPROFILE
|
static cmsHPROFILE
|
||||||
vips_icc_load_profile_image( const char *domain, VipsImage *image )
|
vips_icc_load_profile_image( const char *domain, VipsImage *image )
|
||||||
{
|
{
|
||||||
@ -506,9 +559,8 @@ vips_icc_load_profile_image( const char *domain, VipsImage *image )
|
|||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We allow extra bands for eg. alpha.
|
if( vips_image_expected_bands( image ) !=
|
||||||
*/
|
vips_icc_profile_needs_bands( profile ) ) {
|
||||||
if( image->Bands < vips_icc_profile_needs_bands( profile ) ) {
|
|
||||||
VIPS_FREEF( cmsCloseProfile, profile );
|
VIPS_FREEF( cmsCloseProfile, profile );
|
||||||
vips_warn( domain,
|
vips_warn( domain,
|
||||||
"%s", _( "embedded profile incompatible with image" ) );
|
"%s", _( "embedded profile incompatible with image" ) );
|
||||||
@ -530,9 +582,8 @@ vips_icc_load_profile_file( const char *domain,
|
|||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We allow extra bands for eg. alpha.
|
if( vips_image_expected_bands( image ) !=
|
||||||
*/
|
vips_icc_profile_needs_bands( profile ) ) {
|
||||||
if( image->Bands < vips_icc_profile_needs_bands( profile ) ) {
|
|
||||||
VIPS_FREEF( cmsCloseProfile, profile );
|
VIPS_FREEF( cmsCloseProfile, profile );
|
||||||
vips_warn( domain,
|
vips_warn( domain,
|
||||||
_( "profile \"%s\" incompatible with image" ),
|
_( "profile \"%s\" incompatible with image" ),
|
||||||
|
Loading…
Reference in New Issue
Block a user