add jpeg-chroma-subsample to jpegload

The jpeg loader now sets the field jpeg-chroma-subsample to record
chroma subsample.

See https://github.com/jcupitt/libvips/issues/954
This commit is contained in:
John Cupitt 2018-04-25 16:04:20 +01:00
parent 38ea5937ca
commit 4f22e8d1dc
3 changed files with 29 additions and 0 deletions

View File

@ -16,6 +16,8 @@
- set "interlaced=1" for interlaced JPG and PNG images
- add PDFium PDF loader
- add @format option to magickload
- jpegload adds a jpeg-chroma-subsample field with eg. 4:4:4 for no
chrominance subsampling.
12/3/18 started 8.6.4
- better fitting of fonts with overhanging edges [Adrià]

View File

@ -279,6 +279,25 @@ readjpeg_file( ReadJpeg *jpeg, const char *filename )
return( 0 );
}
static const char *
find_chroma_subsample( struct jpeg_decompress_struct *cinfo )
{
gboolean has_subsample;
/* libjpeg only uses 4:4:4 and 4:2:0, confusingly.
*
* http://poynton.ca/PDFs/Chroma_subsampling_notation.pdf
*/
has_subsample = cinfo->max_h_samp_factor > 1 ||
cinfo->max_v_samp_factor > 1;
if( cinfo->num_components > 3 )
/* A cmyk image.
*/
return( has_subsample ? "4:2:0:4" : "4:4:4:4" );
else
return( has_subsample ? "4:2:0" : "4:4:4" );
}
static int
attach_blob( VipsImage *im, const char *field, void *data, int data_length )
{
@ -439,6 +458,9 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
if( jpeg_has_multiple_scans( cinfo ) )
vips_image_set_int( out, "interlaced", 1 );
(void) vips_image_set_string( out, "jpeg-chroma-subsample",
find_chroma_subsample( cinfo ) );
/* Look for EXIF and ICC profile.
*/
for( p = cinfo->marker_list; p; p = p->next ) {

View File

@ -374,6 +374,11 @@ vips_foreign_load_jpeg_buffer_init( VipsForeignLoadJpegBuffer *buffer )
* memory to load, so this field gives callers a chance to handle these
* images differently.
*
* The string-valued field "jpeg-chroma-subsample" gives the chroma subsample
* in standard notation. 4:4:4 means no subsample, 4:2:0 means YCbCr with
* Cb and Cr subsampled horizontally and vertically, 4:4:4:4 means a CMYK
* image with no subsampling.
*
* The EXIF thumbnail, if present, is attached to the image as
* "jpeg-thumbnail-data". See vips_image_get_blob().
*