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;
}
/* 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);
}
if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
/* Copy the number-of-symbols-of-each-code-length counts */
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
/* Validate the counts. We do this here mainly so we can copy the right *numberofsymbolsfromtheval[]array,withoutriskingmarchingoff *theendofmemory.jchuff.cwilldoamorethoroughtestlater.
*/
nsymbols = 0; for (len = 1; len <= 16; len++)
nsymbols += bits[len]; if (nsymbols < 1 || nsymbols > 256)
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
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 */
cinfo->data_precision = BITS_IN_JSAMPLE; /* Set up two quantization tables using default quality of 75 */
jpeg_set_quality(cinfo, 75, TRUE); /* Set up two Huffman tables */
std_huff_tables(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;
/* 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 > 8)
cinfo->optimize_coding = TRUE;
/* By default, use the simpler non-cosited sampling alignment */
cinfo->CCIR601_sampling = FALSE;
/* No input smoothing */
cinfo->smoothing_factor = 0;
/* 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 */
}
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.