cjpeg -verbose: Print PBMPLUS input file precision

This gives the user a hint as to whether converting the input file into
a JPEG file with a particular data precision will result in a loss of
precision.  Also modify usage.txt and the cjpeg man page to warn the
user about that possibility.
This commit is contained in:
DRC
2024-06-21 10:58:17 -04:00
parent 94c64ead85
commit a8aaaf5d5b
4 changed files with 26 additions and 15 deletions

View File

@@ -5,7 +5,7 @@
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* Modified 2009-2017 by Guido Vollbeding. * Modified 2009-2017 by Guido Vollbeding.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2021, D. R. Commander. * Copyright (C) 2021, 2024, D. R. Commander.
* For conditions of distribution and use, see the accompanying README.ijg * For conditions of distribution and use, see the accompanying README.ijg
* file. * file.
* *
@@ -76,10 +76,10 @@ JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file") JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file") JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
JMESSAGE(JERR_PPM_OUTOFRANGE, "Numeric value out of range in PPM file") JMESSAGE(JERR_PPM_OUTOFRANGE, "Numeric value out of range in PPM file")
JMESSAGE(JTRC_PGM, "%ux%u PGM image") JMESSAGE(JTRC_PGM, "%ux%u PGM image (maximum color value = %u)")
JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image") JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image (maximum color value = %u)")
JMESSAGE(JTRC_PPM, "%ux%u PPM image") JMESSAGE(JTRC_PPM, "%ux%u PPM image (maximum color value = %u)")
JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image") JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image (maximum color value = %u)")
JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format") JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")

View File

@@ -157,7 +157,13 @@ must also be specified. Note that only the PBMPLUS input file format supports
data precisions other than 8. (For historical reasons, data precisions other than 8. (For historical reasons,
.B cjpeg .B cjpeg
allows GIF input files to be converted into 12-bit-per-sample JPEG files, but allows GIF input files to be converted into 12-bit-per-sample JPEG files, but
this is not a useful conversion.) this is not a useful conversion.) Note also that PBMPLUS input files are
silently scaled to the target data precision, even if it is lower than the
precision of the input file. Passing an argument of
.B \-verbose
to
.B cjpeg
will cause it to print information about the precision of the input file.
.B Caution: .B Caution:
12-bit and 16-bit data precision is not yet widely implemented, so many 12-bit and 16-bit data precision is not yet widely implemented, so many
decoders will be unable to handle a 12-bit-per-sample or 16-bit-per-sample JPEG decoders will be unable to handle a 12-bit-per-sample or 16-bit-per-sample JPEG

10
rdppm.c
View File

@@ -5,7 +5,7 @@
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2009 by Bill Allombert, Guido Vollbeding. * Modified 2009 by Bill Allombert, Guido Vollbeding.
* libjpeg-turbo Modifications: * libjpeg-turbo Modifications:
* Copyright (C) 2015-2017, 2020-2023, D. R. Commander. * Copyright (C) 2015-2017, 2020-2024, D. R. Commander.
* For conditions of distribution and use, see the accompanying README.ijg * For conditions of distribution and use, see the accompanying README.ijg
* file. * file.
* *
@@ -707,7 +707,7 @@ start_input_ppm(j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
if (cinfo->in_color_space == JCS_UNKNOWN || if (cinfo->in_color_space == JCS_UNKNOWN ||
cinfo->in_color_space == JCS_RGB) cinfo->in_color_space == JCS_RGB)
cinfo->in_color_space = JCS_GRAYSCALE; cinfo->in_color_space = JCS_GRAYSCALE;
TRACEMS2(cinfo, 1, JTRC_PGM_TEXT, w, h); TRACEMS3(cinfo, 1, JTRC_PGM_TEXT, w, h, maxval);
if (cinfo->in_color_space == JCS_GRAYSCALE) if (cinfo->in_color_space == JCS_GRAYSCALE)
source->pub.get_pixel_rows = get_text_gray_row; source->pub.get_pixel_rows = get_text_gray_row;
else if (IsExtRGB(cinfo->in_color_space)) else if (IsExtRGB(cinfo->in_color_space))
@@ -722,7 +722,7 @@ start_input_ppm(j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
case '3': /* it's a text-format PPM file */ case '3': /* it's a text-format PPM file */
if (cinfo->in_color_space == JCS_UNKNOWN) if (cinfo->in_color_space == JCS_UNKNOWN)
cinfo->in_color_space = JCS_EXT_RGB; cinfo->in_color_space = JCS_EXT_RGB;
TRACEMS2(cinfo, 1, JTRC_PPM_TEXT, w, h); TRACEMS3(cinfo, 1, JTRC_PPM_TEXT, w, h, maxval);
if (IsExtRGB(cinfo->in_color_space)) if (IsExtRGB(cinfo->in_color_space))
source->pub.get_pixel_rows = get_text_rgb_row; source->pub.get_pixel_rows = get_text_rgb_row;
else if (cinfo->in_color_space == JCS_CMYK) else if (cinfo->in_color_space == JCS_CMYK)
@@ -736,7 +736,7 @@ start_input_ppm(j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
if (cinfo->in_color_space == JCS_UNKNOWN || if (cinfo->in_color_space == JCS_UNKNOWN ||
cinfo->in_color_space == JCS_RGB) cinfo->in_color_space == JCS_RGB)
cinfo->in_color_space = JCS_GRAYSCALE; cinfo->in_color_space = JCS_GRAYSCALE;
TRACEMS2(cinfo, 1, JTRC_PGM, w, h); TRACEMS3(cinfo, 1, JTRC_PGM, w, h, maxval);
if (maxval > 255) { if (maxval > 255) {
if (cinfo->in_color_space == JCS_GRAYSCALE) if (cinfo->in_color_space == JCS_GRAYSCALE)
source->pub.get_pixel_rows = get_word_gray_row; source->pub.get_pixel_rows = get_word_gray_row;
@@ -766,7 +766,7 @@ start_input_ppm(j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
case '6': /* it's a raw-format PPM file */ case '6': /* it's a raw-format PPM file */
if (cinfo->in_color_space == JCS_UNKNOWN) if (cinfo->in_color_space == JCS_UNKNOWN)
cinfo->in_color_space = JCS_EXT_RGB; cinfo->in_color_space = JCS_EXT_RGB;
TRACEMS2(cinfo, 1, JTRC_PPM, w, h); TRACEMS3(cinfo, 1, JTRC_PPM, w, h, maxval);
if (maxval > 255) { if (maxval > 255) {
if (IsExtRGB(cinfo->in_color_space)) if (IsExtRGB(cinfo->in_color_space))
source->pub.get_pixel_rows = get_word_rgb_row; source->pub.get_pixel_rows = get_word_rgb_row;

View File

@@ -171,10 +171,15 @@ Switches for advanced users:
PBMPLUS input file format supports data precisions other PBMPLUS input file format supports data precisions other
than 8. (For historical reasons, cjpeg allows GIF input than 8. (For historical reasons, cjpeg allows GIF input
files to be converted into 12-bit-per-sample JPEG files, files to be converted into 12-bit-per-sample JPEG files,
but this is not a useful conversion.) CAUTION: 12-bit but this is not a useful conversion.) Note also that
and 16-bit data precision is not yet widely implemented, PBMPLUS input files are silently scaled to the target
so many decoders will be unable to handle a data precision, even if it is lower than the precision
12-bit-per-sample or 16-bit-per-sample JPEG file at all. of the input file. Passing an argument of -verbose to
cjpeg will cause it to print information about the
precision of the input file. CAUTION: 12-bit and 16-bit
data precision is not yet widely implemented, so many
decoders will be unable to handle a 12-bit-per-sample or
16-bit-per-sample JPEG file at all.
-lossless psv[,Pt] Create a lossless JPEG file using the specified -lossless psv[,Pt] Create a lossless JPEG file using the specified
predictor selection value (1 - 7) and optional point predictor selection value (1 - 7) and optional point