GLOBAL(void)
jpeg_add_quant_table(j_compress_ptr cinfo, int which_tbl, constunsignedint *basic_table, int scale_factor,
boolean force_baseline) /* Define a quantization table equal to the basic_table times *ascalefactor(givenasapercentage). *Ifforce_baselineisTRUE,thecomputedquantizationtableentries *arelimitedto1..255forJPEGbaselinecompatibility.
*/
{
JQUANT_TBL **qtblptr; int i; long temp;
/* Safety check to ensure start_compress not called yet. */ if (cinfo->global_state != CSTATE_START)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
if (*qtblptr == NULL)
*qtblptr = jpeg_alloc_quant_table((j_common_ptr)cinfo);
for (i = 0; i < DCTSIZE2; i++) {
temp = ((long)basic_table[i] * scale_factor + 50L) / 100L; /* limit the values to the valid range */ if (temp <= 0L) temp = 1L; if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ if (force_baseline && temp > 255L)
temp = 255L; /* limit to baseline range if requested */
(*qtblptr)->quantval[i] = (UINT16)temp;
}
/* Initialize sent_table FALSE so table will be written to JPEG file. */
(*qtblptr)->sent_table = FALSE;
}
#if JPEG_LIB_VERSION >= 70
GLOBAL(void)
jpeg_default_qtables(j_compress_ptr cinfo, boolean force_baseline) /* Set or change the 'quality' (quantization) setting, using default tables *andstraightpercentage-scalingqualityscales. *Thisentrypointallowsdifferentscalingsforluminanceandchrominance.
*/
{ /* Set up two quantization tables using the specified scaling */
jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
cinfo->q_scale_factor[0], force_baseline);
jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
cinfo->q_scale_factor[1], force_baseline);
} #endif
GLOBAL(void)
jpeg_set_linear_quality(j_compress_ptr cinfo, int scale_factor,
boolean force_baseline) /* Set or change the 'quality' (quantization) setting, using default tables *andastraightpercentage-scalingqualityscale.Inmostcasesit'sbetter *tousejpeg_set_quality(below);thisentrypointisprovidedfor *applicationsthatinsistonalinearpercentagescaling.
*/
{ /* Set up two quantization tables using the specified scaling */
jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
scale_factor, force_baseline);
jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
scale_factor, force_baseline);
}
GLOBAL(int)
jpeg_quality_scaling(int quality) /* Convert a user-specified quality rating to a percentage scaling factor *foranunderlyingquantizationtable,usingourrecommendedscalingcurve. *Theinput'quality'factorshouldbe0(terrible)to100(verygood).
*/
{ /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ if (quality <= 0) quality = 1; if (quality > 100) quality = 100;
/* The basic table is used as-is (scaling 100) for a quality of 50. *Qualities50..100areconvertedtoscalingpercentage200-2*Q; *notethatatQ=100thescalingis0,whichwillcausejpeg_add_quant_table *tomakeallthetableentries1(hence,minimumquantizationloss). *Qualities1..50areconvertedtoscalingpercentage5000/Q.
*/ if (quality < 50)
quality = 5000 / quality; else
quality = 200 - quality * 2;
return quality;
}
GLOBAL(void)
jpeg_set_quality(j_compress_ptr cinfo, int quality, boolean force_baseline) /* Set or change the 'quality' (quantization) setting, using default tables. *Thisisthestandardquality-adjustingentrypointfortypicaluser *interfaces;onlythosewhowantdetailedcontroloverquantizationtables *wouldusetheprecedingthreeroutinesdirectly.
*/
{ /* Convert user 0-100 rating to percentage scaling */
quality = jpeg_quality_scaling(quality);
/* Set up standard quality tables */
jpeg_set_linear_quality(cinfo, quality, force_baseline);
}
GLOBAL(void)
jpeg_set_defaults(j_compress_ptr cinfo)
{ int i;
/* Safety check to ensure start_compress not called yet. */ if (cinfo->global_state != CSTATE_START)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* Allocate comp_info array large enough for maximum component count. *Arrayismadepermanentincaseapplicationwantstocompress *multipleimagesatsameparamsettings.
*/ if (cinfo->comp_info == NULL)
cinfo->comp_info = (jpeg_component_info *)
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_PERMANENT,
MAX_COMPONENTS * sizeof(jpeg_component_info));
/* Initialize everything not dependent on the color space */
#if JPEG_LIB_VERSION >= 70
cinfo->scale_num = 1; /* 1:1 scaling */
cinfo->scale_denom = 1; #endif /* Set up two quantization tables using default quality of 75 */
jpeg_set_quality(cinfo, 75, TRUE); /* Set up two Huffman tables */
std_huff_tables((j_common_ptr)cinfo);
/* Initialize default arithmetic coding conditioning */ for (i = 0; i < NUM_ARITH_TBLS; i++) {
cinfo->arith_dc_L[i] = 0;
cinfo->arith_dc_U[i] = 1;
cinfo->arith_ac_K[i] = 5;
}
/* Default is no multiple-scan output */
cinfo->scan_info = NULL;
cinfo->num_scans = 0;
/* Default is lossy output */
cinfo->master->lossless = FALSE;
/* Expect normal source image, not raw downsampled data */
cinfo->raw_data_in = FALSE;
/* Use Huffman coding, not arithmetic coding, by default */
cinfo->arith_code = FALSE;
/* By default, don't do extra passes to optimize entropy coding */
cinfo->optimize_coding = FALSE; /* The standard Huffman tables are only valid for 8-bit data precision. *Iftheprecisionishigher,forceoptimizationonsothatusable *tableswillbecomputed.Thistestcanberemovedifdefaulttables *aresuppliedthatarevalidforthedesiredprecision.
*/ if (cinfo->data_precision == 12)
cinfo->optimize_coding = TRUE;
/* By default, use the simpler non-cosited sampling alignment */
cinfo->CCIR601_sampling = FALSE;
GLOBAL(void)
jpeg_default_colorspace(j_compress_ptr cinfo)
{ switch (cinfo->in_color_space) { case JCS_GRAYSCALE:
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); break; case JCS_RGB: case JCS_EXT_RGB: case JCS_EXT_RGBX: case JCS_EXT_BGR: case JCS_EXT_BGRX: case JCS_EXT_XBGR: case JCS_EXT_XRGB: case JCS_EXT_RGBA: case JCS_EXT_BGRA: case JCS_EXT_ABGR: case JCS_EXT_ARGB: #ifdef C_LOSSLESS_SUPPORTED if (cinfo->master->lossless)
jpeg_set_colorspace(cinfo, JCS_RGB); else #endif
jpeg_set_colorspace(cinfo, JCS_YCbCr); break; case JCS_YCbCr:
jpeg_set_colorspace(cinfo, JCS_YCbCr); break; case JCS_CMYK:
jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ break; case JCS_YCCK:
jpeg_set_colorspace(cinfo, JCS_YCCK); break; case JCS_UNKNOWN:
jpeg_set_colorspace(cinfo, JCS_UNKNOWN); break; default:
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
}
}
/* Safety check to ensure start_compress not called yet. */ if (cinfo->global_state != CSTATE_START)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* For all colorspaces, we use Q and Huff tables 0 for luminance components, *tables1forchrominancecomponents.
*/
cinfo->jpeg_color_space = colorspace;
cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
LOCAL(jpeg_scan_info *)
fill_a_scan(jpeg_scan_info *scanptr, int ci, int Ss, int Se, int Ah, int Al) /* Support routine: generate one scan for specified component */
{
scanptr->comps_in_scan = 1;
scanptr->component_index[0] = ci;
scanptr->Ss = Ss;
scanptr->Se = Se;
scanptr->Ah = Ah;
scanptr->Al = Al;
scanptr++; return scanptr;
}
LOCAL(jpeg_scan_info *)
fill_scans(jpeg_scan_info *scanptr, int ncomps, int Ss, int Se, int Ah, int Al) /* Support routine: generate one scan for each component */
{ int ci;
LOCAL(jpeg_scan_info *)
fill_dc_scans(jpeg_scan_info *scanptr, int ncomps, int Ah, int Al) /* Support routine: generate interleaved DC scan if possible, else N scans */
{ int ci;
if (ncomps <= MAX_COMPS_IN_SCAN) { /* Single interleaved DC scan */
scanptr->comps_in_scan = ncomps; for (ci = 0; ci < ncomps; ci++)
scanptr->component_index[ci] = ci;
scanptr->Ss = scanptr->Se = 0;
scanptr->Ah = Ah;
scanptr->Al = Al;
scanptr++;
} else { /* Noninterleaved DC scan for each component */
scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
} return scanptr;
}
GLOBAL(void)
jpeg_simple_progression(j_compress_ptr cinfo)
{ int ncomps = cinfo->num_components; int nscans;
jpeg_scan_info *scanptr;
/* Safety check to ensure start_compress not called yet. */ if (cinfo->global_state != CSTATE_START)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* Figure space needed for script. Calculation must match code below! */ if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { /* Custom script for YCbCr color images. */
nscans = 10;
} else { /* All-purpose script for other color spaces. */ if (ncomps > MAX_COMPS_IN_SCAN)
nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ else
nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */
}
if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { /* Custom script for YCbCr color images. */ /* Initial DC scan */
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); /* Initial AC scan: get some luma data out in a hurry */
scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); /* Chroma data is too small to be worth expending many scans on */
scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); /* Complete spectral selection for luma AC */
scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); /* Refine next bit of luma AC */
scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); /* Finish DC successive approximation */
scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); /* Finish AC successive approximation */
scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); /* Luma bottom bit comes last since it's usually largest scan */
scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
} else { /* All-purpose script for other color spaces. */ /* Successive approximation first pass */
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); /* Successive approximation second pass */
scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); /* Successive approximation final pass */
scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
}
}
#endif/* C_PROGRESSIVE_SUPPORTED */
#ifdef C_LOSSLESS_SUPPORTED
/* *Enablelosslessmode.
*/
GLOBAL(void)
jpeg_enable_lossless(j_compress_ptr cinfo, int predictor_selection_value, int point_transform)
{ /* Safety check to ensure start_compress not called yet. */ if (cinfo->global_state != CSTATE_START)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.