Merge branch 'improve-file-formats' of https://github.com/angelmixu/libvips into angelmixu-improve-file-formats
This commit is contained in:
commit
22a1150cb6
@ -44,6 +44,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
|
||||
|
@ -255,6 +255,7 @@ typedef struct _RtiffHeader {
|
||||
int samples_per_pixel;
|
||||
int bits_per_sample;
|
||||
int photometric_interpretation;
|
||||
int inkset;
|
||||
int sample_format;
|
||||
gboolean separate;
|
||||
int orientation;
|
||||
@ -1329,6 +1330,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 );
|
||||
@ -1358,9 +1360,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;
|
||||
|
||||
@ -2176,7 +2184,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,
|
||||
|
@ -654,18 +654,15 @@ wtiff_write_header( Wtiff *wtiff, Layer *layer )
|
||||
TIFFSetField( tif, TIFFTAG_BITSPERSAMPLE,
|
||||
vips_format_sizeof( wtiff->im->BandFmt ) << 3 );
|
||||
|
||||
if( wtiff->im->Bands < 3 ) {
|
||||
/* Mono or mono + alpha.
|
||||
*/
|
||||
if (wtiff->im->Type == VIPS_INTERPRETATION_B_W ||
|
||||
wtiff->im->Type == VIPS_INTERPRETATION_GREY16) {
|
||||
// Mono or mono + alpha.
|
||||
photometric = wtiff->miniswhite ?
|
||||
PHOTOMETRIC_MINISWHITE :
|
||||
PHOTOMETRIC_MINISBLACK;
|
||||
colour_bands = 1;
|
||||
}
|
||||
else {
|
||||
/* Could be: RGB, CMYK, LAB, perhaps with extra alpha.
|
||||
*/
|
||||
if( wtiff->im->Type == VIPS_INTERPRETATION_LAB ||
|
||||
else if( wtiff->im->Type == VIPS_INTERPRETATION_LAB ||
|
||||
wtiff->im->Type == VIPS_INTERPRETATION_LABS ) {
|
||||
photometric = PHOTOMETRIC_CIELAB;
|
||||
colour_bands = 3;
|
||||
@ -677,6 +674,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 &&
|
||||
@ -698,7 +701,6 @@ wtiff_write_header( Wtiff *wtiff, Layer *layer )
|
||||
photometric = PHOTOMETRIC_RGB;
|
||||
colour_bands = 3;
|
||||
}
|
||||
}
|
||||
|
||||
alpha_bands = VIPS_CLIP( 0,
|
||||
wtiff->im->Bands - colour_bands, MAX_ALPHA );
|
||||
|
Loading…
Reference in New Issue
Block a user