add n-pages metadata item

tiff, magick and pdf load now attach an n-pages metadata item recording
the number of pages in the orginal file

see https://github.com/jcupitt/libvips/issues/953
This commit is contained in:
John Cupitt 2018-04-26 08:55:31 +01:00
parent 4f22e8d1dc
commit da6f4fd043
7 changed files with 50 additions and 32 deletions

View File

@ -18,6 +18,7 @@
- add @format option to magickload
- jpegload adds a jpeg-chroma-subsample field with eg. 4:4:4 for no
chrominance subsampling.
- tiffload, pdfload, magickload set VIPS_META_N_PAGES "n-pages" metadata item
12/3/18 started 8.6.4
- better fitting of fonts with overhanging edges [Adrià]

View File

@ -134,7 +134,14 @@ typedef struct _Read {
ImageInfo *image_info;
ExceptionInfo exception;
/* Number of pages in image.
*/
int n_pages;
/* Number of pages we will read.
*/
int n_frames;
Image **frames;
int frame_height;
@ -203,6 +210,7 @@ read_new( const char *filename, VipsImage *im,
read->image = NULL;
read->image_info = CloneImageInfo( NULL );
GetExceptionInfo( &read->exception );
read->n_pages = 0;
read->n_frames = 0;
read->frames = NULL;
read->frame_height = 0;
@ -488,6 +496,7 @@ parse_header( Read *read )
which says this is a volumetric image
*/
read->n_pages = GetImageListLength( image );
read->n_frames = 0;
for( p = image; p; (p = GetNextImageInList( p )) ) {
if( p->columns != (unsigned int) im->Xsize ||
@ -512,7 +521,7 @@ parse_header( Read *read )
read->n_frames = 1;
#ifdef DEBUG
printf( "image has %d frames\n", read->n_frames );
printf( "will read %d frames\n", read->n_frames );
#endif /*DEBUG*/
if( read->n != -1 )
@ -533,6 +542,8 @@ parse_header( Read *read )
im->Ysize *= read->n_frames;
}
vips_image_set_int( im, VIPS_META_N_PAGES, read->n_pages );
return( 0 );
}

View File

@ -76,7 +76,11 @@ typedef struct _VipsForeignLoadMagick7 {
ImageInfo *image_info;
ExceptionInfo *exception;
int n_frames; /* Number of frames in file */
/* Number of pages in image.
*/
int n_pages;
int n_frames; /* Number of frames we will read */
Image **frames; /* An Image* for each frame */
CacheView **cache_view; /* A CacheView for each frame */
int frame_height;
@ -283,26 +287,6 @@ vips_foreign_load_magick7_dispose( GObject *gobject )
dispose( gobject );
}
static void *
vips_foreign_load_magick7_genesis_cb( void *client )
{
#ifdef DEBUG
printf( "vips_foreign_load_magick7_genesis:\n" );
#endif /*DEBUG*/
MagickCoreGenesis( vips_get_argv0(), MagickFalse );
return( NULL );
}
static void
vips_foreign_load_magick7_genesis( void )
{
static GOnce once = G_ONCE_INIT;
VIPS_ONCE( &once, vips_foreign_load_magick7_genesis_cb, NULL );
}
static int
vips_foreign_load_magick7_build( VipsObject *object )
{
@ -578,14 +562,15 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
which says this is a volumetric image
*/
magick7->n_frames = GetImageListLength( GetFirstImageInList( image ) );
magick7->n_pages = GetImageListLength( GetFirstImageInList( image ) );
#ifdef DEBUG
printf( "image has %d frames\n", magick7->n_frames );
printf( "image has %d pages\n", magick7->n_pages );
#endif /*DEBUG*/
if( magick7->n != -1 )
magick7->n_frames = VIPS_MIN( magick7->n_frames, magick7->n );
magick7->n_frames = magick7->n != -1 ?
VIPS_MIN( magick7->n_frames, magick7->n ) :
magick7->n_pages;
/* So we can finally set the height.
*/
@ -594,11 +579,13 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
out->Ysize *= magick7->n_frames;
}
vips_image_set_int( out, VIPS_META_N_PAGES, magick7->n_pages );
return( 0 );
}
/* We don't bother with GetPixelReadMask(), assume it's everywhere. Don't
* bother with traits, assume taht's always update.
* bother with traits, assume that's always updated.
*
* We do skip index channels. Palette images add extra index channels
* containing the index value from the file before colourmap lookup.
@ -753,7 +740,7 @@ ismagick7( const char *filename )
ExceptionInfo *exception;
int result;
vips_foreign_load_magick7_genesis();
magick_genesis();
/* Horribly slow :-(
*/
@ -853,7 +840,7 @@ vips_foreign_load_magick7_buffer_is_a_buffer( const void *buf, size_t len )
ExceptionInfo *exception;
int result;
vips_foreign_load_magick7_genesis();
magick_genesis();
/* Horribly slow :-(
*/

View File

@ -204,9 +204,10 @@ vips_foreign_load_pdf_set_image( VipsForeignLoadPdf *pdf, VipsImage *out )
*/
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_FATSTRIP, NULL );
/* Extract and attach metadata.
/* Extract and attach metadata. Set the old name too for compat.
*/
vips_image_set_int( out, "pdf-n_pages", pdf->n_pages );
vips_image_set_int( out, VIPS_META_N_PAGES, pdf->n_pages );
for( i = 0; i < n_metadata; i++ ) {
VipsForeignLoadPdfMetadata *metadata =

View File

@ -241,9 +241,10 @@ vips_foreign_load_pdf_set_image( VipsForeignLoadPdf *pdf, VipsImage *out )
*/
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_FATSTRIP, NULL );
/* Extract and attach metadata.
/* Extract and attach metadata. Set the old name too for compat.
*/
vips_image_set_int( out, "pdf-n_pages", pdf->n_pages );
vips_image_set_int( out, VIPS_META_N_PAGES, pdf->n_pages );
for( i = 0; i < n_metadata; i++ ) {
VipsForeignLoadPdfMetadata *metadata =

View File

@ -177,6 +177,8 @@
* - remove missing res warning
* 19/5/17
* - page > 0 could break edge tiles or strips
* 26/4/18
* - add n-pages metadata item
*/
/*
@ -283,6 +285,10 @@ typedef struct _Rtiff {
*/
TIFF *tiff;
/* Number of pages (directories) in image.
*/
int n_pages;
/* The current page we have set.
*/
int current_page;
@ -1230,6 +1236,8 @@ rtiff_set_header( Rtiff *rtiff, VipsImage *out )
vips_image_set_int( out,
VIPS_META_PAGE_HEIGHT, rtiff->header.height );
vips_image_set_int( out, VIPS_META_N_PAGES, rtiff->n_pages );
/* Even though we could end up serving tiled data, always hint
* THINSTRIP, since we're quite happy doing that too, and it could need
* a lot less memory.
@ -1984,6 +1992,7 @@ rtiff_new( VipsImage *out, int page, int n, gboolean autorotate )
rtiff->n = n;
rtiff->autorotate = autorotate;
rtiff->tiff = NULL;
rtiff->n_pages = 0;
rtiff->current_page = -1;
rtiff->sfn = NULL;
rtiff->client = NULL;
@ -2167,8 +2176,9 @@ rtiff_header_read_all( Rtiff *rtiff )
/* -1 means "to the end".
*/
rtiff->n_pages = rtiff_n_pages( rtiff );
if( rtiff->n == -1 )
rtiff->n = rtiff_n_pages( rtiff ) - rtiff->page;
rtiff->n = rtiff->n_pages - rtiff->page;
/* If we're to read many pages, verify that they are all identical.
*/

View File

@ -143,6 +143,13 @@ extern "C" {
*/
#define VIPS_META_PAGE_HEIGHT "page-height"
/**
* VIPS_META_N_PAGES:
*
* If set, the number of pages in the original file.
*/
#define VIPS_META_N_PAGES "n-pages"
guint64 vips_format_sizeof( VipsBandFormat format );
guint64 vips_format_sizeof_unsafe( VipsBandFormat format );