add support for ignore_transformations
so you can turn off orientation etc. for heif images
This commit is contained in:
parent
472f9da0ad
commit
ff711e97ef
@ -67,6 +67,11 @@ typedef struct _VipsForeignLoadHeif {
|
|||||||
int page;
|
int page;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
/* Set to ignore transforms (flip, rotate, crop) stored in the file
|
||||||
|
* header.
|
||||||
|
*/
|
||||||
|
gboolean ignore_transformations;
|
||||||
|
|
||||||
/* Context for this file.
|
/* Context for this file.
|
||||||
*/
|
*/
|
||||||
struct heif_context *ctx;
|
struct heif_context *ctx;
|
||||||
@ -139,22 +144,23 @@ vips_heif_error( struct heif_error error )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const char *vips_foreign_load_heif_magic[] = {
|
static const char *vips_foreign_load_heif_magic[] = {
|
||||||
"ftypheic",
|
"ftypheic", /* A regular heif image */
|
||||||
"ftypheix",
|
"ftypheix", /* Extended range (>8 bit) image */
|
||||||
"ftyphevc",
|
"ftyphevc", /* Image sequence */
|
||||||
"ftypheim",
|
"ftypheim", /* Image sequence */
|
||||||
"ftypheis",
|
"ftypheis", /* Scaleable image */
|
||||||
"ftyphevm",
|
"ftyphevm", /* Multiview sequence */
|
||||||
"ftyphevs",
|
"ftyphevs", /* Scaleable sequence */
|
||||||
"ftypmif1", /* nokia alpha_ image */
|
"ftypmif1", /* Nokia alpha_ image */
|
||||||
"ftypmsf1" /* nokia animation image */
|
"ftypmsf1" /* Nokia animation image */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* THe API has:
|
/* THe API has:
|
||||||
*
|
*
|
||||||
* enum heif_filetype_result result = heif_check_filetype( buf, 12 );
|
* enum heif_filetype_result result = heif_check_filetype( buf, 12 );
|
||||||
*
|
*
|
||||||
* but it's very conservative.
|
* but it's very conservative and seems to be missing some of the Noka hief
|
||||||
|
* types.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
vips_foreign_load_heif_is_a( const char *filename )
|
vips_foreign_load_heif_is_a( const char *filename )
|
||||||
@ -210,7 +216,7 @@ vips_foreign_load_heif_set_header( VipsForeignLoadHeif *heif, VipsImage *out )
|
|||||||
{
|
{
|
||||||
enum heif_color_profile_type profile_type =
|
enum heif_color_profile_type profile_type =
|
||||||
heif_image_handle_get_color_profile_type( heif->handle );
|
heif_image_handle_get_color_profile_type( heif->handle );
|
||||||
/* FIXME none of the Nokia test images seem to set this true.
|
/* FIXME ... never seen this return TRUE on any image, strangely.
|
||||||
*/
|
*/
|
||||||
gboolean has_alpha =
|
gboolean has_alpha =
|
||||||
heif_image_handle_has_alpha_channel( heif->handle );
|
heif_image_handle_has_alpha_channel( heif->handle );
|
||||||
@ -452,15 +458,19 @@ 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;
|
||||||
|
|
||||||
/* Decode the image to 24bit interleaved.
|
/* Decode the image to 24bit interleaved.
|
||||||
*
|
*
|
||||||
* FIXME What will this do for RGBA? Or is alpha always
|
* FIXME What will this do for RGBA? Or is alpha always
|
||||||
* separate?
|
* separate?
|
||||||
*/
|
*/
|
||||||
|
options = heif_decoding_options_alloc();
|
||||||
|
options->ignore_transformations = heif->ignore_transformations;
|
||||||
error = heif_decode_image( heif->handle, &heif->img,
|
error = heif_decode_image( heif->handle, &heif->img,
|
||||||
heif_colorspace_RGB, heif_chroma_interleaved_24bit,
|
heif_colorspace_RGB, heif_chroma_interleaved_24bit,
|
||||||
NULL );
|
options );
|
||||||
|
heif_decoding_options_free( options );
|
||||||
if( error.code ) {
|
if( error.code ) {
|
||||||
vips_heif_error( error );
|
vips_heif_error( error );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
@ -553,6 +563,15 @@ vips_foreign_load_heif_class_init( VipsForeignLoadHeifClass *class )
|
|||||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
G_STRUCT_OFFSET( VipsForeignLoadHeif, n ),
|
G_STRUCT_OFFSET( VipsForeignLoadHeif, n ),
|
||||||
-1, 100000, 1 );
|
-1, 100000, 1 );
|
||||||
|
|
||||||
|
VIPS_ARG_BOOL( class, "ignore_transformations", 4,
|
||||||
|
_( "Ignore transformations" ),
|
||||||
|
_( "Ignore input transformations" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignLoadHeif,
|
||||||
|
ignore_transformations ),
|
||||||
|
FALSE );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -574,6 +593,7 @@ vips_foreign_load_heif_init( VipsForeignLoadHeif *heif )
|
|||||||
*
|
*
|
||||||
* * @page: %gint, page (top-level image number) to read
|
* * @page: %gint, page (top-level image number) to read
|
||||||
* * @n: %gint, load this many pages
|
* * @n: %gint, load this many pages
|
||||||
|
* * @ignore_transformations: %gboolean, ignore image transformations
|
||||||
*
|
*
|
||||||
* Read a HEIF image file into a VIPS image.
|
* Read a HEIF image file into a VIPS image.
|
||||||
*
|
*
|
||||||
@ -584,8 +604,12 @@ vips_foreign_load_heif_init( VipsForeignLoadHeif *heif )
|
|||||||
* rendered in a vertical column. Set to -1 to mean "until the end of the
|
* rendered in a vertical column. Set to -1 to mean "until the end of the
|
||||||
* document". Use vips_grid() to reorganise pages.
|
* document". Use vips_grid() to reorganise pages.
|
||||||
*
|
*
|
||||||
* HEIF images have a primary. The metadata item `heif-primary` gives the page
|
* HEIF images have a primary image. The metadata item `heif-primary` gives
|
||||||
* number of the primary.
|
* the page number of the primary.
|
||||||
|
*
|
||||||
|
* HEIF images can have trsnaformations like rotate, flip and crop stored in
|
||||||
|
* the header. By default, these are applied during load. Set
|
||||||
|
* @ignore_transformations %TRUE to return the untransformed image.
|
||||||
*
|
*
|
||||||
* See also: vips_image_new_from_file().
|
* See also: vips_image_new_from_file().
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user