From fa0514a4d40ad48a204ad373a574a9c8b2b7b78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Angel=20S=C3=A1nchez?= Date: Wed, 13 Nov 2019 16:16:22 +0100 Subject: [PATCH] enable separated/multiband load and save for tiff format --- libvips/foreign/tiff2vips.c | 15 +++++++++++++-- libvips/foreign/vips2tiff.c | 6 ++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libvips/foreign/tiff2vips.c b/libvips/foreign/tiff2vips.c index 9482f22c..a2a7c41d 100644 --- a/libvips/foreign/tiff2vips.c +++ b/libvips/foreign/tiff2vips.c @@ -250,6 +250,7 @@ typedef struct _RtiffHeader { int samples_per_pixel; int bits_per_sample; int photometric_interpretation; + int inkset; int sample_format; gboolean separate; int orientation; @@ -1310,6 +1311,7 @@ rtiff_parse_copy( Rtiff *rtiff, VipsImage *out ) int samples_per_pixel = rtiff->header.samples_per_pixel; int photometric_interpretation = rtiff->header.photometric_interpretation; + int inkset = rtiff->header.inkset; if( rtiff_non_fractional( rtiff ) ) return( -1 ); @@ -1339,9 +1341,15 @@ rtiff_parse_copy( Rtiff *rtiff, VipsImage *out ) out->Type = VIPS_INTERPRETATION_LAB; if( samples_per_pixel >= 4 && - photometric_interpretation == PHOTOMETRIC_SEPARATED ) + photometric_interpretation == PHOTOMETRIC_SEPARATED && + inkset == INKSET_CMYK) out->Type = VIPS_INTERPRETATION_CMYK; + if (samples_per_pixel >= 1 && + photometric_interpretation == PHOTOMETRIC_SEPARATED && + inkset == INKSET_MULTIINK) + out->Type = VIPS_INTERPRETATION_MULTIBAND; + rtiff->sfn = rtiff_memcpy_line; rtiff->client = out; @@ -2151,7 +2159,10 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header ) TIFFTAG_BITSPERSAMPLE, &header->bits_per_sample ) || !tfget16( rtiff->tiff, TIFFTAG_PHOTOMETRIC, - &header->photometric_interpretation ) ) + &header->photometric_interpretation ) || + !tfget16(rtiff->tiff, + TIFFTAG_INKSET, + &header->inkset ) ) return( -1 ); TIFFGetFieldDefaulted( rtiff->tiff, diff --git a/libvips/foreign/vips2tiff.c b/libvips/foreign/vips2tiff.c index ed534d50..78427cdd 100644 --- a/libvips/foreign/vips2tiff.c +++ b/libvips/foreign/vips2tiff.c @@ -677,6 +677,12 @@ wtiff_write_header( Wtiff *wtiff, Layer *layer ) TIFFTAG_INKSET, INKSET_CMYK ); colour_bands = 4; } + else if (wtiff->im->Type == VIPS_INTERPRETATION_MULTIBAND ) { + photometric = PHOTOMETRIC_SEPARATED; + TIFFSetField(tif, + TIFFTAG_INKSET, INKSET_MULTIINK); + colour_bands = 4; + } else if( wtiff->compression == COMPRESSION_JPEG && wtiff->im->Bands == 3 && wtiff->im->BandFmt == VIPS_FORMAT_UCHAR &&