Libjpeg

libjpeg是一个完全用C语言编写的处理JPEG图像数据格式的自由函式库。它包含一个JPEG编解码器的算法实现，以及用于处理JPEG数据的多种实用程序。
该套软件采用C语言编写，并分发为附有源代码的自由软件，采用自定义的宽松（类BSD）自由软件许可证，权利要求为署名。原始版本由独立JPEG工作组（IJG）维护和发布。此外，也有数个提供额外特性的分叉（Fork）。
JPEG JFIF图像在万维网上被广泛使用。它可以调整压缩量级以实现文件大小与视觉质量之间的期望与权衡。

**实用程序**
下列实用程序随libjpeg提供：- cjpeg和djpeg：用于JPEG与其他流行的图像文件格式之间的转换。- rdjpgcom和wrjpgcom：用于在JPEG文件中插入和提取文字注释。- jpegtran：用于在不同JPEG格式之间进行无损转换的工具。

**jpegtran**
jpegtran无需重新编码即可转换JPEG数据(这里有用户界面CropGUI)
命令列介面 jpegtran提供了几种功能，用于重新格式化和重新编码DCT系数的表示，分别用于转换实际图像数据和丢弃JPEG文件中的辅助数据。 关于系数表示的变换包括：- 优化JPEG文件的霍夫曼编码层以增加压缩。- 渐进和顺序JPEG格式之间的转换。- 霍夫曼和算术编码在熵编码法层之间的转换。
这些转变都是完全无损且可逆的。 对图像数据的转换包括：- 消除某些图像程序插入的非标准应用程序特定数据，- 对文件执行某些转换，例如：
** 丢弃颜色通道（转换为灰阶），
** 旋转和翻转90度，
** 裁剪图像块边框（8×8或16×16像素），
** 缩放
这些是非破坏性资料压缩并且对于保留的图像数据是可逆的。重复转档时不重新压缩现有资料解决重复编码(修改)对资料进行二次压缩导致多次量化失真的问题
有一个相关的Windows应用程序 Jpegcrop date=20200629021141 为“jpegtran”提供了一个用户界面。对于Linux等类Unix系统，自由的 CropGUI date=20190416135810 能提供类似功能。
许多程序基于IJG的代码支持JPEG无损转换功能，部分名单见 Lossless Applications List date=20200512052949 。

**历史**
独立JPEG工作组（IJG）的JPEG实现首次公开发布于1991-10-07，并在那是已相当完善。
开发主要由Tom Lane完成。
IJG的开源是其中一个主要的开源包，并且是JPEG标准的成功的关键。许多公司将其整合到各种产品中，如图像编辑器和网络浏览器。
版本5发布于1994年9月24日，整个代码库被重写。它引入了名为rdjpgcom和wrjpgcom的实用程序用于处理嵌入的文字注释。
版本6于1995-08-02到来，支持渐进JPEG和第一版jpegtran实用程序。

**摘要**

**时间线**
ImageSize  = width:640 height:100
PlotArea   = width:90% height:40% left:5% bottom:20%
Period     = from:1992 till:2006
TimeAxis   = orientation:horizontal format:yyyy
ScaleMajor = unit:year increment:1 start:1993 # rough scale
PlotData   =
color:dullyellow fontsize:S                 # setting standards
bar:ReleaseYear from:1992 till:1994 # version 4
bar:ReleaseYear from:1994 till:1995 color:yelloworange # version 5
bar:ReleaseYear from:1995 till:end # version 6
at:1993 shift:(-6,0)  text:"4a"
at:1994 shift:(-3,0)  text:"5"
at:1995 shift:(-3,0)  text:"6"
at:1998 shift:(-6,0)  text:"6b"
TextData   =
pos:(20,80) fontsize:M text: Year of release of versions # position and text for the title
ImageSize  = width:640 height:100
PlotArea   = width:90% height:40% left:5% bottom:45%
Period     = from:2006 till:2020
TimeAxis   = orientation:horizontal format:yyyy
ScaleMajor = unit:year increment:1 start:2007 # rough scale
PlotData   =
color:dullyellow fontsize:S                 # setting standards
bar:ReleaseYear from:2006 till:2009 # version 6
bar:ReleaseYear from:2009 till:2010 color:yelloworange # version 7
bar:ReleaseYear from:2010 till:2013 # version 8
bar:ReleaseYear from:2013 till:end  color:yelloworange # version 9
at:2009 shift:(-3,0)  text:"7"
at:2010 shift:(-3,0)  text:"8"
at:2012 shift:(-6,0)  text:"8d"
at:2013 shift:(-3,0)  text:"9"
at:2016 shift:(-6,0)  text:"9b"

**复刻**
比较著名的复刻是libjpeg-turbo，它优化了执行的速度；还有mozjpeg，它的优化目标是更小的文件大小。除了这些以外，还有一个出自国际标准化组织（ISO）的libjpeg，其目的是所有JPEG 1标准的完整实现。

**libjpeg-turbo**
libjpeg-turbo是libjpeg的一个复刻，它采用单指令流多数据流（SIMD）指令来加速JPEG编码和解码基础效率。许多项目现在使用libjpeg-turbo而不是libjpeg，包括流行的GNU/Linux发行版（Fedora、Debian、Mageia、OpenSUSE等）、Mozilla和Chrome。除了性能方面，部分项目也因它允许向后保留与旧的libjpeg v6b版本的ABI兼容性而选择使用libjpeg-turbo。libjpeg v7、v8和v9已打破与早期版本的ABI兼容性。
libjpeg-turbo可以配置为与libjpeg v7或v8 ABI兼容，但，但它并没有实现IJG近期发布的完整的功能集，包括SmartScale格式的扩展名。因此，通过libjpeg v8和之后版本创建的SmartScale文件将不能被libjpeg-turbo正确解压。

**mozjpeg**
mozjpeg是由Josh Aas和其他Mozilla Research人员完成的libjpeg-turbo的一个复刻。它旨在通过减少文件大小（约10%）来加快网页的加载时间，以及在不改变图像质量的前提下提高编码效率。为达到此目的，它在编码（不对称）方面使用更多处理能力，同时保持与JPEG标准的完全兼容性，不需要在解码器侧做任何改变。它实际通过优化霍夫曼编码树完成。
除了libjpeg-turbo，mozjpeg版本也建立在jpegcrush之上，这是Loren Merritt编写的一个Perl脚本。

**参见**
 JPEG- 无损数据压缩#无损编辑- 有损数据压缩

**参考资料**

**外部链接**
 Official website of the Independent JPEG Group-  JPEG FAQs date=20210126191551 -  JPEGclub date=20100116010354  – 为libjpeg提供额外特性-  libjpeg面向Windows的二进制包 date=20200917053339 （托管于SourceForge.net上的GnuWin32中）-  libjpeg-turbo date=20210205205000 ，一个ABI及API兼容的libjpeg的复刻，它使用x86 SIMD指令实现参考实现的大幅加速。- mozjpeg - filesize-optimising复刻- Josh Aas, Robert Nyman; August 2014：  使用mozjpeg创建高效JPEG date=20201112025821  – mozjpeg的实用性概述-  关于JPEG的那点事儿 date=20200926222411 ，2016/02/21