jpeglib画质的代码分析

简介: jpeglib画质的代码分析
  • jpeg_set_quality():对外的设置函数
  • jpeg_quality_scaling():参数处理,差不多是反转一下。
    int scale_factor = quality;
    /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */
    if (scale_factor <= 0)
    {
        scale_factor = 1;
    }
    else if (scale_factor > 100)
    {
        scale_factor = 100;
    }
    if (scale_factor < 50)
    {
        scale_factor = 5000 / scale_factor;
    }
    else
    {
        scale_factor = 200 - scale_factor*2;
    }
  • jpeg_set_linear_quality():处理std_luminance_quant_tbl/std_chrominance_quant_tbl。注意参数scale_factor
  • jpeg_add_quant_table:
//force_baseline=TRUE
//DCTSIZE2=8*8
//scale_factor:质量,整数,0-100
//basic_table:std_luminance_quant_tbl和std_chrominance_quant_tbl
for (i = 0; i < DCTSIZE2; i++)
{
    //原来代码是long,并无必要。这里的50,是指默认表质量为50的意思
    int temp = ( basic_table[i] * scale_factor + 50) / 100;
    /* limit the values to the valid range */
    if (temp <= 0)
    {
        temp = 1;
    }
    else if (temp > 0x8FFFF)
    {
        //32767不如使用0x8FFF
        temp = 0x8FFFF; /* max quantizer needed for 12 bits */
    }
    if (force_baseline && temp > 0xFF)
    {
        //255L不如使用0xFF
        temp = 0xFF;    /* limit to baseline range if requested */
    }
    (*qtblptr)->quantval[i] = (UINT16) temp;
}
  • 50的质量表
/* These are the sample quantization tables given in JPEG spec section K.1.
 * The spec says that the values given produce "good" quality, and
 * when divided by 2, "very good" quality.
 */
static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
  16,  11,  10,  16,  24,  40,  51,  61,
  12,  12,  14,  19,  26,  58,  60,  55,
  14,  13,  16,  24,  40,  57,  69,  56,
  14,  17,  22,  29,  51,  87,  80,  62,
  18,  22,  37,  56,  68, 109, 103,  77,
  24,  35,  55,  64,  81, 104, 113,  92,
  49,  64,  78,  87, 103, 121, 120, 101,
  72,  92,  95,  98, 112, 100, 103,  99
};
static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
  17,  18,  24,  47,  99,  99,  99,  99,
  18,  21,  26,  66,  99,  99,  99,  99,
  24,  26,  56,  99,  99,  99,  99,  99,
  47,  66,  99,  99,  99,  99,  99,  99,
  99,  99,  99,  99,  99,  99,  99,  99,
  99,  99,  99,  99,  99,  99,  99,  99,
  99,  99,  99,  99,  99,  99,  99,  99,
  99,  99,  99,  99,  99,  99,  99,  99
};
目录
相关文章
|
20小时前
|
计算机视觉 Python
Opencv播放视频文件、将视频转换为灰度视频实战(附Python源码)
Opencv播放视频文件、将视频转换为灰度视频实战(附Python源码)
71 0
|
7月前
|
编译器 计算机视觉
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV vs2015编译
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV vs2015编译
|
9月前
超简洁ffmpeg编译ffplay
超简洁ffmpeg编译ffplay
57 0
超简洁ffmpeg编译ffplay
|
10月前
移植mjpg_streamer使其支持拍照功能
移植mjpg_streamer使其支持拍照功能
45 0
|
12月前
|
编译器 API C语言
简单的源码免杀过av
简单的源码免杀过av
|
Ubuntu Linux API
FFmpeg静态编译
FFmpeg静态编译
396 0
|
编解码 NoSQL Linux
用VsDebug断点调试FFmpeg
用VsDebug断点调试FFmpeg
116 0
编译ffmpeg没有生成编译后ffplay
编译ffmpeg没有生成编译后ffplay
213 0
|
缓存 安全 程序员
IDA F5 增强插件,还我源代码(一)
IDA F5 增强插件,还我源代码(一)
IDA F5 增强插件,还我源代码(一)