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
};
目录
相关文章
ly~
|
1月前
|
Ubuntu Linux C语言
SDL 图形库安装常见错误及解决方法
SDL(Simple DirectMedia Layer)图形库安装过程中可能会遇到编译错误、运行时错误、依赖库缺失等问题。本文总结了在 Linux 和 Windows 系统上常见的错误及解决方法,包括检查和安装依赖库、配置 SDL 子系统、处理 X11 错误等,帮助用户顺利完成 SDL 的安装和配置。
ly~
112 8
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
82 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ly~
|
1月前
|
监控 Linux API
如何评估 SDL 图形库优化的效果
SDL(Simple DirectMedia Layer)是一个免费开源的多媒体开发库,广泛用于游戏和多媒体应用。优化后的SDL在性能、图像质量、加载速度、兼容性、跨平台性和开发效率等方面均有显著提升。性能方面,优化后的SDL提高了渲染效率和播放路数;图像质量上,通过先进的渲染技术提升了图像的清晰度和色彩准确性;加载速度方面,通过减少格式转换时间加快了图像加载速度;兼容性和跨平台性得到增强,支持多种操作系统和硬件设备;开发效率方面,简洁的API设计和丰富的文档帮助开发者快速上手,减少了开发时间和成本。这些优化使SDL成为游戏开发和多媒体应用的理想选择。
ly~
23 4
|
5月前
|
计算机视觉 C++ Windows
OpenCV 3.1.0编译与添加扩展模块
OpenCV 3.1.0编译与添加扩展模块
70 0
|
5月前
|
机器学习/深度学习 并行计算 计算机视觉
【入坑指南】| OpenCV4.8 + CUDA + 扩展模块支持编译
【入坑指南】| OpenCV4.8 + CUDA + 扩展模块支持编译
483 0
|
编译器 计算机视觉
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV vs2015编译
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV vs2015编译
超简洁ffmpeg编译ffplay
超简洁ffmpeg编译ffplay
98 0
超简洁ffmpeg编译ffplay
|
编解码 Shell iOS开发
iOS音视频开发 - LAME编译
MP3编码引擎,目前在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且还能保证整个音频文件的体积非常小
|
Ubuntu Linux API
FFmpeg静态编译
FFmpeg静态编译
495 0
编译ffmpeg没有生成编译后ffplay
编译ffmpeg没有生成编译后ffplay
261 0