[enh] Clearer error message for unsupported precision

This commit is contained in:
Julien Malik 2016-03-25 09:46:24 +01:00
parent 9399e26291
commit 8a3fb6edf8
1 changed files with 39 additions and 17 deletions

View File

@ -166,7 +166,7 @@ static void tif_32sto16u(const OPJ_INT32* pSrc, OPJ_UINT16* pDst, OPJ_SIZE_T len
int imagetotif(opj_image_t * image, const char *outfile) int imagetotif(opj_image_t * image, const char *outfile)
{ {
int width, height; int width, height;
int bps,adjust, sgnd; int bps,adjust, sgnd, tifbps;
int tiPhoto; int tiPhoto;
TIFF *tif; TIFF *tif;
tdata_t buf; tdata_t buf;
@ -223,19 +223,41 @@ int imagetotif(opj_image_t * image, const char *outfile)
return 1; return 1;
} }
/* Store 3-bits input as 4-bits TIFF, 5-bits as 6-bits, etc... */ /* Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits TIFF are implemented */
if ( (bps != 1) && (bps & 1) ) switch (bps)
{ {
bps += 1; case 1:
} case 2:
case 4:
if((bps > 16) || ((bps != 1) && (bps & 1))) bps = 0; case 6:
if(bps == 0) case 8:
{ case 10:
fprintf(stderr,"imagetotif: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",bps); case 12:
case 14:
case 16:
/* Generate a TIFF with BitsPerSample equal to the input image bps */
tifbps = bps;
break;
case 3:
case 5:
case 7:
case 9:
case 11:
case 13:
case 15:
/* Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits TIFF are implemented
* For odd bps, choose the nearest supported TIFF BitsPerSample that can hold input bps
*/
tifbps = bps + 1;
break;
default:
fprintf(stderr,"imagetotif: Input image is %d bits per sample, but only TIFF with 1 <= BitsPerSample <= 16 are implemented.\n",bps);
fprintf(stderr,"imagetotif: Unable to match input image precision to a supported TIFF BitsPerSample.\n");
fprintf(stderr,"\tAborting\n"); fprintf(stderr,"\tAborting\n");
return 1; return 1;
break;
} }
tif = TIFFOpen(outfile, "wb"); tif = TIFFOpen(outfile, "wb");
if (!tif) if (!tif)
{ {
@ -246,13 +268,13 @@ int imagetotif(opj_image_t * image, const char *outfile)
clip_component(&(image->comps[i]), image->comps[0].prec); clip_component(&(image->comps[i]), image->comps[0].prec);
} }
cvtPxToCx = convert_32s_PXCX_LUT[numcomps]; cvtPxToCx = convert_32s_PXCX_LUT[numcomps];
switch (bps) { switch (tifbps) {
case 1: case 1:
case 2: case 2:
case 4: case 4:
case 6: case 6:
case 8: case 8:
cvt32sToTif = convert_32sXXu_C1R_LUT[bps]; cvt32sToTif = convert_32sXXu_C1R_LUT[tifbps];
break; break;
case 10: case 10:
cvt32sToTif = tif_32sto10u; cvt32sToTif = tif_32sto10u;
@ -278,14 +300,14 @@ int imagetotif(opj_image_t * image, const char *outfile)
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, tifbps);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
strip_size = TIFFStripSize(tif); strip_size = TIFFStripSize(tif);
rowStride = ((OPJ_SIZE_T)width * numcomps * (OPJ_SIZE_T)bps + 7U) / 8U; rowStride = ((OPJ_SIZE_T)width * numcomps * (OPJ_SIZE_T)tifbps + 7U) / 8U;
if (rowStride != (OPJ_SIZE_T)strip_size) { if (rowStride != (OPJ_SIZE_T)strip_size) {
fprintf(stderr, "Invalid TIFF strip size\n"); fprintf(stderr, "Invalid TIFF strip size\n");
TIFFClose(tif); TIFFClose(tif);
@ -415,7 +437,7 @@ static void tif_16uto32s(const OPJ_UINT16* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T len
} }
/* /*
* libtiff/tif_getimage.c : 1,2,4,8,16 bitspersample accepted * libtiff/tif_getimage.c : 1, 2, 4, 6, 8, 10, 12, 14 and 16 bitspersample accepted
* CINEMA : 12 bit precision * CINEMA : 12 bit precision
*/ */
opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)