try to fix IM load of ico files

8-bit ico files were being reported at 32-bit, because we used the
->depth field to get pixel depth

try using GetImageChannelDepth() instead, who knows, it might work

see https://github.com/jcupitt/php-vips/issues/34
This commit is contained in:
John Cupitt 2017-02-23 20:05:35 +00:00
parent 156f729d75
commit 4bcbcbbf49

View File

@ -53,6 +53,8 @@
* - fix @page with graphicsmagick * - fix @page with graphicsmagick
* 25/11/16 * 25/11/16
* - remove @all_frames, add @n * - remove @all_frames, add @n
* 23/2/17
* - try using GetImageChannelDepth() instead of ->depth
*/ */
/* /*
@ -304,6 +306,7 @@ parse_header( Read *read )
VipsImage *im = read->im; VipsImage *im = read->im;
Image *image = read->image; Image *image = read->image;
int depth;
Image *p; Image *p;
int i; int i;
@ -332,28 +335,33 @@ parse_header( Read *read )
if( (im->Bands = get_bands( image )) < 0 ) if( (im->Bands = get_bands( image )) < 0 )
return( -1 ); return( -1 );
/* Depth can be 'fractional'. You'd think we should use /* Depth can be 'fractional'.
*
* You'd think we should use
* GetImageDepth() but that seems unreliable. 16-bit mono DICOM images * GetImageDepth() but that seems unreliable. 16-bit mono DICOM images
* are reported as depth 1, for example. * are reported as depth 1, for example.
*
* Try GetImageChannelDepth(), maybe that works.
*/ */
depth = GetImageChannelDepth( image, AllChannels, &image->exception );
im->BandFmt = -1; im->BandFmt = -1;
if( image->depth >= 1 && image->depth <= 8 ) if( depth >= 1 && depth <= 8 )
im->BandFmt = VIPS_FORMAT_UCHAR; im->BandFmt = VIPS_FORMAT_UCHAR;
if( image->depth >= 9 && image->depth <= 16 ) if( depth >= 9 && depth <= 16 )
im->BandFmt = VIPS_FORMAT_USHORT; im->BandFmt = VIPS_FORMAT_USHORT;
#ifdef UseHDRI #ifdef UseHDRI
if( image->depth == 32 ) if( depth == 32 )
im->BandFmt = VIPS_FORMAT_FLOAT; im->BandFmt = VIPS_FORMAT_FLOAT;
if( image->depth == 64 ) if( depth == 64 )
im->BandFmt = VIPS_FORMAT_DOUBLE; im->BandFmt = VIPS_FORMAT_DOUBLE;
#else /*!UseHDRI*/ #else /*!UseHDRI*/
if( image->depth == 32 ) if( depth == 32 )
im->BandFmt = VIPS_FORMAT_UINT; im->BandFmt = VIPS_FORMAT_UINT;
#endif /*UseHDRI*/ #endif /*UseHDRI*/
if( im->BandFmt == -1 ) { if( im->BandFmt == -1 ) {
vips_error( "magick2vips", _( "unsupported bit depth %d" ), vips_error( "magick2vips", _( "unsupported bit depth %d" ),
(int) image->depth ); (int) depth );
return( -1 ); return( -1 );
} }