enable alpha handling in heic load

use RGBA decoding, when appropriate

see https://github.com/libvips/libvips/issues/1411
This commit is contained in:
John Cupitt 2019-09-01 16:37:43 +01:00
parent 0e63a410bb
commit 75b45cc2ef
2 changed files with 18 additions and 12 deletions

View File

@ -11,6 +11,7 @@
- add vips_switch() / vips_case() ... fast many-way ifthenelse - add vips_switch() / vips_case() ... fast many-way ifthenelse
- better const handling for arithmetic operators fixes comparisons against out - better const handling for arithmetic operators fixes comparisons against out
of range values of range values
- handle alpha in heifload [meyermarcel]
31/8/19 started 8.8.3 31/8/19 started 8.8.3
- revert sharpen restoring the input colourspace - revert sharpen restoring the input colourspace

View File

@ -7,6 +7,8 @@
* 24/7/19 * 24/7/19
* - close early on minimise * - close early on minimise
* - close early on error * - close early on error
* 1/9/19 [meyermarcel]
* - handle alpha
*/ */
/* /*
@ -86,6 +88,10 @@ typedef struct _VipsForeignLoadHeif {
*/ */
int n_top; int n_top;
/* TRUE for RGBA ... otherwise, RGB.
*/
gboolean has_alpha;
/* Size of final output image. /* Size of final output image.
*/ */
int width; int width;
@ -260,7 +266,6 @@ vips_foreign_load_heif_set_page( VipsForeignLoadHeif *heif,
static int static int
vips_foreign_load_heif_set_header( VipsForeignLoadHeif *heif, VipsImage *out ) vips_foreign_load_heif_set_header( VipsForeignLoadHeif *heif, VipsImage *out )
{ {
gboolean has_alpha;
int bands; int bands;
int i; int i;
/* Surely, 16 metadata items will be enough for anyone. /* Surely, 16 metadata items will be enough for anyone.
@ -275,10 +280,12 @@ vips_foreign_load_heif_set_header( VipsForeignLoadHeif *heif, VipsImage *out )
if( vips_foreign_load_heif_set_page( heif, heif->page, FALSE ) ) if( vips_foreign_load_heif_set_page( heif, heif->page, FALSE ) )
return( -1 ); return( -1 );
/* FIXME ... never seen this return TRUE on any image, strangely. heif->has_alpha = heif_image_handle_has_alpha_channel( heif->handle );
*/ #ifdef DEBUG
has_alpha = heif_image_handle_has_alpha_channel( heif->handle ); printf( "heif_image_handle_has_alpha_channel() = %d\n",
bands = has_alpha ? 4 : 3; heif->has_alpha );
#endif /*DEBUG*/
bands = heif->has_alpha ? 4 : 3;
/* FIXME .. need to test XMP and IPCT. /* FIXME .. need to test XMP and IPCT.
*/ */
@ -617,13 +624,11 @@ vips_foreign_load_heif_generate( VipsRegion *or,
if( !heif->img ) { if( !heif->img ) {
struct heif_error error; struct heif_error error;
struct heif_decoding_options *options; struct heif_decoding_options *options;
enum heif_chroma chroma = heif->has_alpha ?
heif_chroma_interleaved_RGBA :
heif_chroma_interleaved_RGB;
/* Decode the image to 24bit interleaved. /* Only disable transforms if we have been able to fetch the
*
* FIXME What will this do for RGBA? Or is alpha always
* separate?
*
* Only disable transforms if we have been able to fetch the
* untransformed dimensions. * untransformed dimensions.
*/ */
options = heif_decoding_options_alloc(); options = heif_decoding_options_alloc();
@ -631,7 +636,7 @@ vips_foreign_load_heif_generate( VipsRegion *or,
options->ignore_transformations = !heif->autorotate; options->ignore_transformations = !heif->autorotate;
#endif /*HAVE_HEIF_IMAGE_HANDLE_GET_ISPE_WIDTH*/ #endif /*HAVE_HEIF_IMAGE_HANDLE_GET_ISPE_WIDTH*/
error = heif_decode_image( heif->handle, &heif->img, error = heif_decode_image( heif->handle, &heif->img,
heif_colorspace_RGB, heif_chroma_interleaved_RGB, heif_colorspace_RGB, chroma,
options ); options );
heif_decoding_options_free( options ); heif_decoding_options_free( options );
if( error.code ) { if( error.code ) {