Jump to content

Libjpeg: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Added {{External links}} tag
(24 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{Short description|Free software library for handling the JPEG image format}}
{{Short description|Free software library for handling the JPEG image format}}
{{Cleanup bare URLs|date=August 2022}}
{{External links|date=August 2024}}
{{lowercase title|title=libjpeg}}
{{lowercase title|title=libjpeg}}
{{Infobox software
{{Infobox software
Line 11: Line 11:
{{cite web|url=https://sourceforge.net/p/libjpeg/mailman/libjpeg-devel-6x/?viewmonth=202006&viewday=6|title=Re: [Libjpeg-devel-6x] 4 Integer Overflow Errors in libjpeg-9c|last=Friesenhahn|first=Bob|date=June 6, 2020|website=SourceForge.net|publisher=[[SourceForge]]|access-date=2021-01-25|quote=The only concern was that Guido Vollbeding is not likely subscribed to this list and IJG JPEG is essentially developed by one person.}}</ref>
{{cite web|url=https://sourceforge.net/p/libjpeg/mailman/libjpeg-devel-6x/?viewmonth=202006&viewday=6|title=Re: [Libjpeg-devel-6x] 4 Integer Overflow Errors in libjpeg-9c|last=Friesenhahn|first=Bob|date=June 6, 2020|website=SourceForge.net|publisher=[[SourceForge]]|access-date=2021-01-25|quote=The only concern was that Guido Vollbeding is not likely subscribed to this list and IJG JPEG is essentially developed by one person.}}</ref>
| released = {{start date and age|1991|10|7}}
| released = {{start date and age|1991|10|7}}
| latest release version = {{wikidata|property|preferred|references|edit|P348|P548=Q2804309}}
| latest_release_version = 9e
| latest_release_date = {{Release date and age|2022|01|16}}
| latest release date = {{Start date and age|{{wikidata|qualifier|preferred|single|P348|P548=Q2804309|P577}}|df=yes}}
| programming language = [[C (programming language)|C]]
| programming language = [[C (programming language)|C]]
| operating_system = [[Cross-platform]]
| operating_system = [[Cross-platform]]
Line 46: Line 46:
These are [[lossless]] and reversible only regarding the image data that is kept. Reencoding with repeated lossy quantisation of the image data ([[generation loss]]) does not take place.
These are [[lossless]] and reversible only regarding the image data that is kept. Reencoding with repeated lossy quantisation of the image data ([[generation loss]]) does not take place.


There is an associated Windows application, [https://jpegclub.org/ Jpegcrop], which provides a user interface to ''jpegtran''. For [[Unix-like system]]s like [[Linux]] there is the free [http://emergent.unpythonic.net/01248401946 CropGUI] with similar functionality.
There is an associated Windows application, [https://jpegclub.org/ Jpegcrop], which provides a user interface to ''jpegtran''. On Macintosh there is the app [https://metalands.net/projects/square-pusher/ SquarePusher]. For [[Unix-like system]]s like [[Linux]] there is the free [http://emergent.unpythonic.net/01248401946 CropGUI] with similar functionality.
More programs supporting JPEG lossless transformation functions based on the IJG code are given on the [https://jpegclub.org/losslessapps.html Lossless Applications List].
More programs supporting JPEG lossless transformation functions based on the IJG code are given on the [https://jpegclub.org/losslessapps.html Lossless Applications List].


Line 56: Line 56:
For version 5, which was released on September 24, 1994, the whole code base was rewritten. It introduced the utility programs ''rdjpgcom'' and ''wrjpgcom'' for handling embedded text comments.
For version 5, which was released on September 24, 1994, the whole code base was rewritten. It introduced the utility programs ''rdjpgcom'' and ''wrjpgcom'' for handling embedded text comments.
The version 6 from 2 August 1995 came with support for progressive JPEG and for the first time with the utility program ''jpegtran''. This utility was extended with features to rotate and flip images and grayscale reduction in version 6b.
The version 6 from 2 August 1995 came with support for progressive JPEG and for the first time with the utility program ''jpegtran''. This utility was extended with features to rotate and flip images and grayscale reduction in version 6b.

=== libjpeg-turbo and descendants ===


From version 6b of libjpeg of 27 March 1998, Miyasaka Masaru forked a branch named ''libjpeg/SIMD'', which included x86 SIMD optimisations. It got substantial contributions from the TigerVNC and the VirtualGL projects in 2009. On that basis the libjpeg-turbo project was created in 2010.<ref name="libjpeg-turbo"/>
From version 6b of libjpeg of 27 March 1998, Miyasaka Masaru forked a branch named ''libjpeg/SIMD'', which included x86 SIMD optimisations. It got substantial contributions from the TigerVNC and the VirtualGL projects in 2009. On that basis the libjpeg-turbo project was created in 2010.<ref name="libjpeg-turbo"/>


On 4 March 2014, the first version of the filesize-optimising fork ''MozJPEG'' was published. For this version Josh Aas from Mozilla Research reworked the [[Perl]] script ''jpegcrush'' from [[x264]]'s main developer Loren Merritt and integrated it into the code base of libjpeg-turbo.<ref name="heise.de"/>
After 11 years and a change in leadership, the IJG released new versions of libjpeg (7 through 9), of which each broke ABI compatibility with previous versions.<ref name="compatibility-analysis"/> The changes that were held in prospect after the 6x series were not delivered.<ref name="ijg-is-back"/>
In version 7, support for [[arithmetic coding]] was introduced, which earlier has been rejected because of the [[software patent|patent]] situation, as well as the crop feature in jpegtran (<code>-crop</code>).<ref name="ijg-is-back"/>


On 10 July 2014, Mozilla released version 2.0, which mainly added trellis quantisation and is now able to reduce the size of baseline JPEGs also. [[Facebook]], Inc. donated {{val|60000|u=dollars}} for the development of the next version,<ref name="MozJPEG2"/> and [[CloudFlare]] assigned a developer for the improvement of MozJPEG.<ref name="CloudFlare"/>
Versions 8 and 9 served basically for the introduction of controversial<ref name="SmartScale"/> incompatible format extensions. These are widely regarded as ineffective and inferior to existing, standardised solutions.<ref name="v9turbo"/><ref name="v8review"/> Their standardisation was rejected after submission to the [[ITU-T]]. The original organiser Tom Lane and others criticize these changes as a break from the goals of the IJG.<ref name="SmartScale"/>


In 2019, libjpeg-turbo became the ISO and ITU endorsed reference implementation for the JPEG format.<ref name=refimpl/>
On 4 March 2014, the first version of the filesize-optimising fork ''mozjpeg'' was published. For this version Josh Aas from Mozilla Research reworked the [[Perl]] script ''jpegcrush'' from [[x264]]'s main developer Loren Merritt and integrated it into the code base of libjpeg-turbo.<ref name="heise.de"/>

In April 2024, Google introduced ''Jpegli'', a new JPEG coding library that offers enhanced capabilities and a 35% compression ratio improvement at high quality compression settings, while the coding speed is comparable with MozJPEG.<ref>{{cite web |title=Introducing Jpegli: A New JPEG Coding Library |url=https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html |publisher=Google Open Source Blog |access-date=4 April 2024 |archive-url=https://web.archive.org/web/20240403181607/https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html |archive-date=3 April 2024 |date=3 April 2024}}</ref>

=== Change in IJG leadership ===

After 11 years and a change in leadership, the IJG under Guido Vollbeding released new versions of libjpeg (7 through 9), of which each broke ABI compatibility with previous versions.<ref name="compatibility-analysis"/> The changes that were held in prospect after the 6x series were not delivered.<ref name="ijg-is-back"/>
In version 7, support for [[arithmetic coding]] was introduced, which earlier has been rejected because of the [[software patent|patent]] situation, as well as the crop feature in jpegtran (<code>-crop</code>).<ref name="ijg-is-back"/>


Versions 8 and 9 served basically for the introduction of controversial<ref name=TomSmartScale/> incompatible format extensions. These are widely regarded as ineffective and inferior to existing, standardised solutions.<ref name="v9turbo"/><ref name="v8review"/> Their standardisation was rejected after submission to the [[ITU-T]]. The original organiser Tom Lane and others criticize these changes as a break from the goals of the IJG.<ref name=TomSmartScale/>
On 10 July 2014, Mozilla released version 2.0, which mainly added trellis quantisation and is now able to reduce the size of baseline JPEGs also. [[Facebook]], Inc. donated {{val|60000|u=dollars}} for the development of the next version,<ref name="mozjpeg2"/> and [[CloudFlare]] assigned a developer for the improvement of mozjpeg.<ref name="CloudFlare"/>


==Versions==
==Versions==


{| class="wikitable"
{| class="wikitable plainlist"
|-
|-
! Version
! Version
Line 80: Line 88:
| {{Version |o |1}}
| {{Version |o |1}}
| 1991
| 1991
|
| First release<br />Baseline or optimized JPEG<br />GIF or PPM output
*First release
*Baseline or optimized JPEG
*GIF or PPM output
|-
|-
| {{Version |o |2}}
| {{Version |o |2}}
| 1991
| 1991
|
| Internal improvements<br />More input/output formats
*Internal improvements
*More input/output formats
|-
|-
| {{Version |o |3}}
| {{Version |o |3}}
Line 112: Line 125:
| {{Version |o |6}}
| {{Version |o |6}}
| 1995-08-02
| 1995-08-02
|
| Progressive JPEG<br />jpegtran (convert between baseline and progressive)
*Progressive JPEG
*jpegtran (convert between baseline and progressive)
|-
|-
| {{Version |o |6a}}
| {{Version |o |6a}}
Line 120: Line 135:
| {{Version |co |6b}}
| {{Version |co |6b}}
| 1998-03-27
| 1998-03-27
|
| jpegtran extended to lossless rotate<br />(used by '''libjpeg-turbo''' and '''mozjpeg''')
*jpegtran extended to lossless rotate
|-
(used by '''libjpeg-turbo''', '''MozJPEG''' and '''Jpegli''')
! colspan=4 style="text-align: center;" | Proprietary non-compatible extensions
|-
|-
| {{Version |o |7}}
| {{Version |o |7}}
| 2009-06-27
| 2009-06-27
|
| jpegtran extended to lossless crop<br />
*jpegtran extended to lossless crop
T.851 Arithmetic Coding<ref>{{cite web |title=ITU-T T.81 (JPEG-1)-based still-image coding using an alternative arithmetic coder |date=September 2009 |url=https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-T.851-200509-I!!PDF-E&type=items |type=pdf }}</ref><br />
*T.851 Arithmetic Coding<ref>{{cite web |title=ITU-T T.81 (JPEG-1)-based still-image coding using an alternative arithmetic coder |date=September 2009 |url=https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-T.851-200509-I!!PDF-E&type=items |type=pdf }}</ref>
SmartScale extension (ITU rejected)<ref>[http://jpegclub.org/temp/ITU-T-JPEG-Plus-Proposal_R3.doc ITU-T JPEG-Plus Proposal R3]</ref><ref>[http://jpegclub.org/temp/Evolution_of_JPEG.doc Evolution of JPEG]</ref>
*Scaled DCT<ref name="TurboSmartScale"/>
|-
! colspan=4 style="text-align: center;" | Proprietary non-compatible extensions
|-
|-
| {{Version |o |8}}
| {{Version |o |8}}
| 2010-01-10
| 2010-01-10
|
|Internal fixes<br />jpegtran extended to use SmartScale
*SmartScale extension (ITU rejected)<ref>[http://jpegclub.org/temp/ITU-T-JPEG-Plus-Proposal_R3.doc ITU-T JPEG-Plus Proposal R3]</ref><ref>[http://jpegclub.org/temp/Evolution_of_JPEG.doc Evolution of JPEG]</ref>
*jpegtran extended to use SmartScale
*Internal fixes
|-
|-
| {{Version |o |8a}}
| {{Version |o |8a}}
Line 140: Line 161:
| {{Version |o |8b}}
| {{Version |o |8b}}
| 2010-05-16
| 2010-05-16
| Memory corruption & build fixes
|
|-
|-
| {{Version |o |8c}}
| {{Version |o |8c}}
| 2011-01-16
| 2011-01-16
| Variable DCT block size
| Option for selecting DCT block size (SmartScale)
|-
|-
| {{Version |o |8d}}
| {{Version |o |8d}}
Line 152: Line 173:
| {{Version |o |9}}
| {{Version |o |9}}
| 2013-01-13
| 2013-01-13
|
| [[YCoCg]] color<br /> Lossless compression (1x1 DCT)<ref>[http://jpegclub.org/temp/JPEG_9_Lossless_Coding.doc JPEG 9 Lossless Coding]</ref>
*[[YCoCg]] color
*Lossless compression (1x1 DCT)<ref>[http://jpegclub.org/temp/JPEG_9_Lossless_Coding.doc JPEG 9 Lossless Coding]</ref>
|-
|-
| {{Version |o |9a}}
| {{Version |o |9a}}
| 2014-01-19
| 2014-01-19
|
| "[[JFIF]]v2" [[scRGB]] Wide color gamut (standard unknown)<br />8-12 bit color (original JPEG)
* "[[JFIF]]v2" [[scRGB]] Wide color gamut (standard unknown)
*8-12 bit color (standardJPEG)
|-
|-
| {{Version |o |9b}}
| {{Version |o |9b}}
| 2016-01-17
| 2016-01-17
|Computation improvements
|
|-
|-
| {{Version |o |9c}}
| {{Version |o |9c}}
| 2018-01-14
| 2018-01-14
|{{code|jpegtran -wipe}}
|
|-
|-
| {{Version |o |9d}}
| {{Version |o |9d}}
| 2020-01-12
| 2020-01-12
|
|
*Code cleanup
*Huffman optimization
*x64 support (MSVC)
*{{code|jpegtran -drop}}
|-
|-
| {{Version |c |9e}}
| {{Version |o |9e}}
| 2022-01-16
| 2022-01-16
|ARM and ARM64 support (MSVC)
|-
| {{Version |c |9f}}
| 2024-01-14
|
|
*ARM64EC support (MSVC)
*Xcode build system
*C++Builder/RAD Studio build system
|}
|}
{{Version |t |show=111100}}
{{Version |t |show=111100}}


==Forks==
==Forks==
Well-known forks are libjpeg-turbo, which optimises for speed of execution, and mozjpeg, which optimises for smaller file sizes.
Well-known forks are libjpeg-turbo, which optimises for speed of execution, and MozJPEG, which optimises for smaller file sizes.


There is also a [[#ISO libjpeg|similarly named library]] from the [[International Organization for Standardization|ISO]], which aims to be a complete implementation of JPEG, [[JPEG XT]] and [[JPEG-LS]] standards.<ref>{{Cite web|url=https://github.com/thorfdbg/libjpeg|title = Libjpeg|website = [[GitHub]]|date = 6 October 2021}}</ref>
There is also a [[#ISO libjpeg|similarly named library]] from the [[International Organization for Standardization|ISO]], which aims to be a complete implementation of JPEG, [[JPEG XT]] and [[JPEG-LS]] standards.<ref>{{Cite web|url=https://github.com/thorfdbg/libjpeg|title = Libjpeg|website = [[GitHub]]|date = 6 October 2021}}</ref>
Line 190: Line 226:
| developer = libjpeg-turbo Project
| developer = libjpeg-turbo Project
| released = {{start date and age|2010|11|19}}
| released = {{start date and age|2010|11|19}}
| latest_release_version = 2.1.2
| latest_release_version = 3.0.0
| latest_release_date = {{Release date and age|2021|08|10}}
| latest_release_date = {{Release date and age|2023|07|03}}
| website = {{URL|libjpeg-turbo.org}}
| website = {{URL|libjpeg-turbo.org}}
| repo = {{URL|github.com/libjpeg-turbo}}
| repo = {{URL|github.com/libjpeg-turbo}}
Line 197: Line 233:
libjpeg-turbo is a [[Fork (software development)|fork]] of libjpeg that uses [[SIMD]] [[Instruction set|instructions]] to accelerate baseline JPEG encoding and decoding. Many projects are now using libjpeg-turbo instead of libjpeg, including popular Linux distributions ([[Fedora (operating system)|Fedora]], [[Debian]], [[Mageia]], [[openSUSE]], ...), [[Mozilla]], and [[Google Chrome|Chrome]].<ref name="turbo-software"/><ref name="Chromium"/><ref name="turbo 1.2"/> Apart from performance, some projects have chosen to use libjpeg-turbo because it allows them to retain backward [[Application binary interface|ABI]] compatibility with the older libjpeg v6b release.<ref name="Fedora"/> libjpeg v7, v8 and v9 broke ABI compatibility with prior releases.<ref name="compatibility-analysis"/>
libjpeg-turbo is a [[Fork (software development)|fork]] of libjpeg that uses [[SIMD]] [[Instruction set|instructions]] to accelerate baseline JPEG encoding and decoding. Many projects are now using libjpeg-turbo instead of libjpeg, including popular Linux distributions ([[Fedora (operating system)|Fedora]], [[Debian]], [[Mageia]], [[openSUSE]], ...), [[Mozilla]], and [[Google Chrome|Chrome]].<ref name="turbo-software"/><ref name="Chromium"/><ref name="turbo 1.2"/> Apart from performance, some projects have chosen to use libjpeg-turbo because it allows them to retain backward [[Application binary interface|ABI]] compatibility with the older libjpeg v6b release.<ref name="Fedora"/> libjpeg v7, v8 and v9 broke ABI compatibility with prior releases.<ref name="compatibility-analysis"/>


libjpeg-turbo can be configured to be compatible with the libjpeg v7 or v8 ABI, but it does not implement the complete set of features in recent IJG releases, including the SmartScale format extension.<ref name="turboREADME"/> The libjpeg-turbo Project has chosen not to support SmartScale, citing concerns regarding the fact that it is not an [[ITU-T]] standard and citing their own research that questions the usefulness of the feature. By extension, since the only major new feature in libjpeg v9 is specific to the SmartScale format, the libjpeg-turbo Project has chosen to forgo emulating libjpeg v9.<ref name="v9turbo"/> Therefore, SmartScale files created by libjpeg v8 and later will not be decompressed correctly by libjpeg-turbo.
libjpeg-turbo implements the standard-compliant arithmetic coding and lossless crop features seen in libjpeg v7. It can also be configured to be compatible with the libjpeg v7 or v8 ABI, but it does implement DCT scaling and the proprietary SmartScale, which builds on DCT scaling.<ref name="turboREADME"/> libjpeg-turbo chooses not to support SmartScale, because it is not an [[ITU-T]] standard and because their own research finds it (and DCT scaling) ineffective.<ref name="TurboSmartScale">{{cite web |title=libjpeg-turbo {{!}} About / A Study on the Usefulness of DCT Scaling and SmartScale |url=https://libjpeg-turbo.org/About/SmartScale |website=libjpeg-turbo.org}}</ref> By extension, since the only major new feature in libjpeg v9 is specific to the SmartScale format, the libjpeg-turbo Project has chosen to forgo emulating libjpeg v9.<ref name="v9turbo"/>


libjpeg-turbo is one of the two JPEG reference implementations, available as [http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=75845 ISO/IEC 10918-7] and [https://www.itu.int/rec/T-REC-T.873-201905-1 ITU-T T.873]. The other reference implementation is ISO libjpeg which also includes support for JPEG XT and JPEG LS.
Since 2019, libjpeg-turbo is one of the two JPEG reference implementations, available as ISO/IEC 10918-7 and ITU-T T.873.<ref name=refimpl>{{cite web |title=ISO/IEC 10918-7:2019 Information technology — Digital compression and coding of continuous-tone still images — Part 7: Reference software |url=https://www.iso.org/standard/75845.html |website=ISO |language=en}}{{cite web |title=T.873 (05/19): Information technology - Digital compression and coding of continuous-tone still images: Reference software |url=https://www.itu.int/rec/T-REC-T.873-201905-S/en |website=www.itu.int}}</ref> The other reference implementation is ISO libjpeg which also includes support for JPEG XT and JPEG LS.


=== mozjpeg ===
=== MozJPEG ===
{{Infobox software
{{Infobox software
| name = mozjpeg
| name = MozJPEG
| logo = [[File:mozjpeg logotype.svg|120px|mozjpeg]]
| logo = [[File:mozjpeg logotype.svg|120px|MozJPEG]]
| screenshot = cjpeg-screenshot.png
| screenshot = cjpeg-screenshot.png
| caption = mozjpeg tries several partitionings of the spectrum of DCT coefficients
| caption = MozJPEG tries several partitionings of the spectrum of DCT coefficients
| developer = [[Mozilla Research]]
| developer = [[Mozilla Research]]
| released = {{start date and age|2014|3|4}}
| released = {{start date and age|2014|3|4}}
| latest_release_version = 4.0.3
| latest_release_version = 4.1.1
| latest_release_date = {{Release date and age|2021|02|26}}<ref>{{cite web
| latest_release_date = {{Release date and age|2021|02|26}}<ref>{{cite web
| url = https://github.com/mozilla/mozjpeg/releases
| url = https://github.com/mozilla/mozjpeg/releases
| title = Releases · mozilla/mozjpeg
| title = Releases · mozilla/mozjpeg
| website = github.com
| website = github.com
| access-date = 2021-04-14
| access-date = 2022-08-14
}}</ref>
}}</ref>
| website = {{url|https://github.com/mozilla/mozjpeg}}
| website = {{url|https://github.com/mozilla/mozjpeg}}
}}
}}
mozjpeg is a fork from libjpeg-turbo done by Josh Aas and others from Mozilla Research. It aims to speed up loading times of webpages by achieving a reduction in file size (of about 10%) and therefore transmission time through improvement of coding efficiency while retaining image quality. To achieve this, it uses more processing power for the encoding (asymmetry) while retaining full compatibility with the JPEG standard and requiring no changes on the decoder side.
MozJPEG is a fork from libjpeg-turbo done by Josh Aas and others from Mozilla Research. It aims to speed up loading times of webpages by achieving a reduction in file size (of about 10%) and therefore transmission time through improvement of coding efficiency while retaining image quality. To achieve this, it uses more processing power for the encoding (asymmetry) while retaining full compatibility with the JPEG standard and requiring no changes on the decoder side.


The techniques mozjpeg uses to achieve high compression include optimising [[Huffman coding|Huffman]] trees, using progressive coding to optimally split the spectrum of DCT coefficients into separate scans, and through the use of [[trellis quantisation]]. Additionally, the presets are aggressively tuned towards the minimisation of file sizes.
The techniques MozJPEG uses to achieve high compression include optimising [[Huffman coding|Huffman]] trees, using progressive coding to optimally split the spectrum of DCT coefficients into separate scans, and through the use of [[trellis quantisation]]. Additionally, the presets are aggressively tuned towards the minimisation of file sizes.


Besides libjpeg-turbo, mozjpeg also builds upon jpegcrush, a [[Perl]] script by Loren Merritt.<ref name="heise.de"/><ref name="golem.de"/>
Besides libjpeg-turbo, MozJPEG also builds upon jpegcrush, a [[Perl]] script by Loren Merritt.<ref name="heise.de"/><ref name="golem.de"/>

=== Jpegli ===
{{Infobox software
| name = Jpegli
| developer = [[Google]]
| released = {{start date and age|2024|04|03}}
| repo = {{URL|github.com/libjxl/libjxl/tree/main/lib/jpegli}}
| website = {{URL|github.com/libjxl/libjxl/tree/main/lib/jpegli}}
}}
In April 2024, Google introduced ''Jpegli'', a new JPEG coding library that offers enhanced capabilities and a 35% compression ratio improvement at high quality compression settings, while the coding speed is comparable with MozJPEG.<ref>{{cite web |title=Introducing Jpegli: A New JPEG Coding Library |url=https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html |publisher=Google Open Source Blog |access-date=4 April 2024 |archive-url=https://web.archive.org/web/20240403181607/https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html |archive-date=3 April 2024 |date=3 April 2024}}</ref>


== ISO libjpeg ==
== ISO libjpeg ==
{{main|JPEG XT#libjpeg}}
{{main|JPEG XT#libjpeg}}
ISO/IEC [[Joint Photography Experts Group]] maintains a reference software implementation for base [[JPEG]] (ISO/IEC 10918-1 and 18477-1) and [[JPEG XT]] extensions (ISO/IEC 18477 Parts 2 and 6-9), as well as lossless [[JPEG-LS]] (ISO/IEC 14495).<ref name=software>{{Cite web|url=https://jpeg.org/jpegxt/software.html|title = Jpeg - Jpeg Xt}}</ref> It also includes some of the optimizations of mozjpeg. Though also named libjpeg, it is not related to the source code provided by Independent JPEG Group (IJG) and does not support proprietary extensions introduced by IJG since 2007.
ISO/IEC [[Joint Photography Experts Group]] maintains a reference software implementation for base [[JPEG]] (ISO/IEC 10918-1 and 18477-1) and [[JPEG XT]] extensions (ISO/IEC 18477 Parts 2 and 6-9), as well as lossless [[JPEG-LS]] (ISO/IEC 14495).<ref name=software>{{Cite web|url=https://jpeg.org/jpegxt/software.html|title = Jpeg - Jpeg Xt}}</ref> It also includes some of the optimizations of MozJPEG. Though also named libjpeg, it is not related to the source code provided by Independent JPEG Group (IJG) and does not support proprietary extensions introduced by IJG since 2007.


==See also==
==See also==
Line 247: Line 293:
<ref name="JPEG-homepage">[http://old.jpeg.org/jpeg/ JPEG homepage]</ref>
<ref name="JPEG-homepage">[http://old.jpeg.org/jpeg/ JPEG homepage]</ref>


<ref name="libjpeg-turbo">http://libjpeg-turbo.virtualgl.org/</ref>
<ref name="libjpeg-turbo">{{cite web|url=http://libjpeg-turbo.virtualgl.org/|title=libjpeg-turbo|website=libjpeg-turbo}}</ref>


<ref name="compatibility-analysis">{{cite web |url=https://abi-laboratory.pro/tracker/timeline/libjpeg/ |title=libjpeg: API/ABI changes review |accessdate=2017-10-28 }}</ref>
<ref name="compatibility-analysis">{{cite web |url=https://abi-laboratory.pro/tracker/timeline/libjpeg/ |title=libjpeg: API/ABI changes review |accessdate=2017-10-28 }}</ref>
Line 253: Line 299:
<ref name="ijg-is-back">Mans Rullgard (Hardwarebug.org), August 4, 2009: [http://hardwarebug.org/2009/08/04/ijg-is-back/ IJG is back] {{Webarchive|url=https://web.archive.org/web/20140716155045/http://hardwarebug.org/2009/08/04/ijg-is-back/ |date=2014-07-16 }}</ref>
<ref name="ijg-is-back">Mans Rullgard (Hardwarebug.org), August 4, 2009: [http://hardwarebug.org/2009/08/04/ijg-is-back/ IJG is back] {{Webarchive|url=https://web.archive.org/web/20140716155045/http://hardwarebug.org/2009/08/04/ijg-is-back/ |date=2014-07-16 }}</ref>


<ref name="SmartScale">Tom Lane, January 16, 2013: [https://lists.fedoraproject.org/pipermail/devel/2013-January/176400.html jpeg-9, API/ABI compatibility, and the future role of this project]</ref>
<ref name=TomSmartScale>Tom Lane, January 16, 2013: [https://lists.fedoraproject.org/pipermail/devel/2013-January/176400.html jpeg-9, API/ABI compatibility, and the future role of this project]</ref>


<ref name="v9turbo">{{cite web|title=What About libjpeg v9?|url=http://libjpeg-turbo.org/About/Jpeg-9|publisher=libjpeg-turbo team|accessdate=February 8, 2013}}</ref>
<ref name="v9turbo">{{cite web|title=What About libjpeg v9?|url=http://libjpeg-turbo.org/About/Jpeg-9|publisher=libjpeg-turbo team|accessdate=February 8, 2013}}</ref>
Line 259: Line 305:
<ref name="v8review">Mans Rullgard (Hardwarebug.org), February 1, 2010: [http://hardwarebug.org/2010/02/01/ijg-swings-again-and-misses/ IJG swings again, and misses]</ref>
<ref name="v8review">Mans Rullgard (Hardwarebug.org), February 1, 2010: [http://hardwarebug.org/2010/02/01/ijg-swings-again-and-misses/ IJG swings again, and misses]</ref>


<ref name="mozjpeg2">Sebastian Grüner, 16. Juli 2014: [http://golem.de/1407/107916 mozjpeg 2.0: Facebook unterstützt JPEG-Encoder von Mozilla]</ref>
<ref name="MozJPEG2">Sebastian Grüner, 16. Juli 2014: [http://golem.de/1407/107916 MozJPEG 2.0: Facebook unterstützt JPEG-Encoder von Mozilla]</ref>


<ref name="CloudFlare">{{Cite web|url=http://www.soeren-hentzschel.at/mozilla/2014/07/30/cloudflare-moechte-zu-mozillas-jpeg-encoder-beitragen/|title=CloudFlare möchte zu Mozillas JPEG-Encoder beitragen|date=30 July 2014}}</ref>
<ref name="CloudFlare">{{Cite web|url=http://www.soeren-hentzschel.at/mozilla/2014/07/30/cloudflare-moechte-zu-mozillas-jpeg-encoder-beitragen/|title=CloudFlare möchte zu Mozillas JPEG-Encoder beitragen|date=30 July 2014}}</ref>
Line 284: Line 330:
* [http://www.faqs.org/faqs/jpeg-faq/ JPEG FAQs]
* [http://www.faqs.org/faqs/jpeg-faq/ JPEG FAQs]
* [https://libjpeg-turbo.org/ libjpeg-turbo], an ABI-/API-compatible fork of libjpeg that uses x86 SIMD instructions to achieve a substantial speedup over the reference implementation.
* [https://libjpeg-turbo.org/ libjpeg-turbo], an ABI-/API-compatible fork of libjpeg that uses x86 SIMD instructions to achieve a substantial speedup over the reference implementation.
* {{github|mozilla/mozjpeg|mozjpeg - the filesize-optimising fork}}
* {{github|mozilla/mozjpeg|MozJPEG - the filesize-optimising fork}}
* {{cite web |first1= Robert |last1= Nyman |first2= Josh |last2= Aas |date= Aug 6, 2014 |url= https://hacks.mozilla.org/2014/08/using-mozjpeg-to-create-efficient-jpegs/ |title= Using mozjpeg to Create Efficient JPEGs |publisher= Mozilla |work= Hacks }}
* {{cite web |first1= Robert |last1= Nyman |first2= Josh |last2= Aas |date= Aug 6, 2014 |url= https://hacks.mozilla.org/2014/08/using-mozjpeg-to-create-efficient-jpegs/ |title= Using MozJPEG to Create Efficient JPEGs |publisher= Mozilla |work= Hacks }}
* {{github|google/jpegli|Jpegli}}, an improved JPEG encoder and decoder implementation


[[Category:JPEG]]
[[Category:JPEG]]

Revision as of 22:46, 20 August 2024

libjpeg
Developer(s)Independent JPEG Group
Guido Vollbeding (maintainer)[1][2]
Initial releaseOctober 7, 1991; 32 years ago (1991-10-07)
Stable release
9f[3] Edit this on Wikidata / 14 January 2024; 8 months ago (14 January 2024)
Written inC
Operating systemCross-platform
Typelibrary
LicenseCustom BSD-like (free software)
Websiteijg.org
jpegclub.org

libjpeg is a free library with functions for handling the JPEG image data format. It implements a JPEG codec (encoding and decoding) alongside various utilities for handling JPEG data. It is written in C and distributed as free software together with its source code under the terms of a custom permissive (BSD-like) free software license, which demands attribution. The original variant is maintained and published by the Independent JPEG Group (IJG). Meanwhile, there are several forks with additional features.

JPEG JFIF images are widely used on the Web. The amount of compression can be adjusted to achieve the desired trade-off between file size and visual quality.[4]

Utilities

The following utility programs are shipped together with libjpeg:

cjpeg and djpeg
for performing conversions between JPEG and some other popular image file formats.
rdjpgcom and wrjpgcom
for inserting and extracting textual comments in JPEG files.
jpegtran
for transformation of existing JPEG files.

jpegtran

jpegtran transforms JPEG data without reencoding
(here with user interface CropGUI)

The command-line program jpegtran provides several features for reformatting and recoding the representation of the DCT coefficients, for transformation of actual image data and for discarding auxiliary data in JPEG files, respectively. The transformations regarding the representation of the coefficients comprise:

These transformations are each completely lossless and reversible. The transformations on the image data comprise:

  • eliminate non-standard application-specific data inserted by some image programs,
  • perform certain transformations on a file, such as:
    • discarding of colour channels (conversion to greyscale),
    • rotating and flipping in steps of 90 degrees,
    • cropping or joining at image block borders (every 8×8 or 16×16 pixels),
    • rescaling.[8]

These are lossless and reversible only regarding the image data that is kept. Reencoding with repeated lossy quantisation of the image data (generation loss) does not take place.

There is an associated Windows application, Jpegcrop, which provides a user interface to jpegtran. On Macintosh there is the app SquarePusher. For Unix-like systems like Linux there is the free CropGUI with similar functionality. More programs supporting JPEG lossless transformation functions based on the IJG code are given on the Lossless Applications List.

History

The JPEG implementation of the Independent JPEG Group (IJG) was first publicly released on 7 October 1991 and has been considerably developed since that time. The development was initially mainly done by Tom Lane. The open-source implementation of the IJG was one of the major open-source packages and was key to the success of the JPEG standard. Many companies incorporated it into a variety of products such as image editors and web browsers.[9]

For version 5, which was released on September 24, 1994, the whole code base was rewritten. It introduced the utility programs rdjpgcom and wrjpgcom for handling embedded text comments. The version 6 from 2 August 1995 came with support for progressive JPEG and for the first time with the utility program jpegtran. This utility was extended with features to rotate and flip images and grayscale reduction in version 6b.

libjpeg-turbo and descendants

From version 6b of libjpeg of 27 March 1998, Miyasaka Masaru forked a branch named libjpeg/SIMD, which included x86 SIMD optimisations. It got substantial contributions from the TigerVNC and the VirtualGL projects in 2009. On that basis the libjpeg-turbo project was created in 2010.[10]

On 4 March 2014, the first version of the filesize-optimising fork MozJPEG was published. For this version Josh Aas from Mozilla Research reworked the Perl script jpegcrush from x264's main developer Loren Merritt and integrated it into the code base of libjpeg-turbo.[11]

On 10 July 2014, Mozilla released version 2.0, which mainly added trellis quantisation and is now able to reduce the size of baseline JPEGs also. Facebook, Inc. donated 60000 dollars for the development of the next version,[12] and CloudFlare assigned a developer for the improvement of MozJPEG.[13]

In 2019, libjpeg-turbo became the ISO and ITU endorsed reference implementation for the JPEG format.[14]

In April 2024, Google introduced Jpegli, a new JPEG coding library that offers enhanced capabilities and a 35% compression ratio improvement at high quality compression settings, while the coding speed is comparable with MozJPEG.[15]

Change in IJG leadership

After 11 years and a change in leadership, the IJG under Guido Vollbeding released new versions of libjpeg (7 through 9), of which each broke ABI compatibility with previous versions.[16] The changes that were held in prospect after the 6x series were not delivered.[17] In version 7, support for arithmetic coding was introduced, which earlier has been rejected because of the patent situation, as well as the crop feature in jpegtran (-crop).[17]

Versions 8 and 9 served basically for the introduction of controversial[18] incompatible format extensions. These are widely regarded as ineffective and inferior to existing, standardised solutions.[19][20] Their standardisation was rejected after submission to the ITU-T. The original organiser Tom Lane and others criticize these changes as a break from the goals of the IJG.[18]

Versions

Version Released New features
ITU T.81 JPEG Compatible
Old version, no longer maintained: 1 1991
  • First release
  • Baseline or optimized JPEG
  • GIF or PPM output
Old version, no longer maintained: 2 1991
  • Internal improvements
  • More input/output formats
Old version, no longer maintained: 3 1992 Internal and image quality improvements
Old version, no longer maintained: 4 1992 Internal and speed improvements
Old version, no longer maintained: 4a 1993-02-18
Old version, no longer maintained: 5 1994-09-24 Internal improvements and revised API
Old version, no longer maintained: 5a 1994-12-07
Old version, no longer maintained: 5b 1995-03-15
Old version, no longer maintained: 6 1995-08-02
  • Progressive JPEG
  • jpegtran (convert between baseline and progressive)
Old version, no longer maintained: 6a 1996-02-07
Older version, yet still maintained: 6b 1998-03-27
  • jpegtran extended to lossless rotate

(used by libjpeg-turbo, MozJPEG and Jpegli)

Old version, no longer maintained: 7 2009-06-27
  • jpegtran extended to lossless crop
  • T.851 Arithmetic Coding[21]
  • Scaled DCT[22]
Proprietary non-compatible extensions
Old version, no longer maintained: 8 2010-01-10
  • SmartScale extension (ITU rejected)[23][24]
  • jpegtran extended to use SmartScale
  • Internal fixes
Old version, no longer maintained: 8a 2010-02-28 RGBA
Old version, no longer maintained: 8b 2010-05-16 Memory corruption & build fixes
Old version, no longer maintained: 8c 2011-01-16 Option for selecting DCT block size (SmartScale)
Old version, no longer maintained: 8d 2012-01-15 RGB JPEG (no color transform to YCbCr)
Old version, no longer maintained: 9 2013-01-13
  • YCoCg color
  • Lossless compression (1x1 DCT)[25]
Old version, no longer maintained: 9a 2014-01-19
  • "JFIFv2" scRGB Wide color gamut (standard unknown)
  • 8-12 bit color (standardJPEG)
Old version, no longer maintained: 9b 2016-01-17 Computation improvements
Old version, no longer maintained: 9c 2018-01-14 jpegtran -wipe
Old version, no longer maintained: 9d 2020-01-12
  • Code cleanup
  • Huffman optimization
  • x64 support (MSVC)
  • jpegtran -drop
Old version, no longer maintained: 9e 2022-01-16 ARM and ARM64 support (MSVC)
Current stable version: 9f 2024-01-14
  • ARM64EC support (MSVC)
  • Xcode build system
  • C++Builder/RAD Studio build system
Legend: Old version, not maintained Older version, still maintained Current stable version Latest preview version Future release

Forks

Well-known forks are libjpeg-turbo, which optimises for speed of execution, and MozJPEG, which optimises for smaller file sizes.

There is also a similarly named library from the ISO, which aims to be a complete implementation of JPEG, JPEG XT and JPEG-LS standards.[26]

libjpeg-turbo

libjpeg-turbo
Developer(s)libjpeg-turbo Project
Initial releaseNovember 19, 2010; 13 years ago (2010-11-19)
Stable release
3.0.0 / July 3, 2023; 14 months ago (2023-07-03)
Repositorygithub.com/libjpeg-turbo
Websitelibjpeg-turbo.org

libjpeg-turbo is a fork of libjpeg that uses SIMD instructions to accelerate baseline JPEG encoding and decoding. Many projects are now using libjpeg-turbo instead of libjpeg, including popular Linux distributions (Fedora, Debian, Mageia, openSUSE, ...), Mozilla, and Chrome.[27][28][29] Apart from performance, some projects have chosen to use libjpeg-turbo because it allows them to retain backward ABI compatibility with the older libjpeg v6b release.[30] libjpeg v7, v8 and v9 broke ABI compatibility with prior releases.[16]

libjpeg-turbo implements the standard-compliant arithmetic coding and lossless crop features seen in libjpeg v7. It can also be configured to be compatible with the libjpeg v7 or v8 ABI, but it does implement DCT scaling and the proprietary SmartScale, which builds on DCT scaling.[31] libjpeg-turbo chooses not to support SmartScale, because it is not an ITU-T standard and because their own research finds it (and DCT scaling) ineffective.[22] By extension, since the only major new feature in libjpeg v9 is specific to the SmartScale format, the libjpeg-turbo Project has chosen to forgo emulating libjpeg v9.[19]

Since 2019, libjpeg-turbo is one of the two JPEG reference implementations, available as ISO/IEC 10918-7 and ITU-T T.873.[14] The other reference implementation is ISO libjpeg which also includes support for JPEG XT and JPEG LS.

MozJPEG

MozJPEG
Developer(s)Mozilla Research
Initial releaseMarch 4, 2014; 10 years ago (2014-03-04)
Stable release
4.1.1 / February 26, 2021; 3 years ago (2021-02-26)[32]
Websitegithub.com/mozilla/mozjpeg

MozJPEG is a fork from libjpeg-turbo done by Josh Aas and others from Mozilla Research. It aims to speed up loading times of webpages by achieving a reduction in file size (of about 10%) and therefore transmission time through improvement of coding efficiency while retaining image quality. To achieve this, it uses more processing power for the encoding (asymmetry) while retaining full compatibility with the JPEG standard and requiring no changes on the decoder side.

The techniques MozJPEG uses to achieve high compression include optimising Huffman trees, using progressive coding to optimally split the spectrum of DCT coefficients into separate scans, and through the use of trellis quantisation. Additionally, the presets are aggressively tuned towards the minimisation of file sizes.

Besides libjpeg-turbo, MozJPEG also builds upon jpegcrush, a Perl script by Loren Merritt.[11][33]

Jpegli

Jpegli
Developer(s)Google
Initial releaseApril 3, 2024; 5 months ago (2024-04-03)
Repositorygithub.com/libjxl/libjxl/tree/main/lib/jpegli
Websitegithub.com/libjxl/libjxl/tree/main/lib/jpegli

In April 2024, Google introduced Jpegli, a new JPEG coding library that offers enhanced capabilities and a 35% compression ratio improvement at high quality compression settings, while the coding speed is comparable with MozJPEG.[34]

ISO libjpeg

ISO/IEC Joint Photography Experts Group maintains a reference software implementation for base JPEG (ISO/IEC 10918-1 and 18477-1) and JPEG XT extensions (ISO/IEC 18477 Parts 2 and 6-9), as well as lossless JPEG-LS (ISO/IEC 14495).[35] It also includes some of the optimizations of MozJPEG. Though also named libjpeg, it is not related to the source code provided by Independent JPEG Group (IJG) and does not support proprietary extensions introduced by IJG since 2007.

See also

References

  1. ^ Göhler, Lars (April 29, 2020). "New Version of libjpeg (Ver. 9d) of Independent JPEG Group available now". JPEGclub.org. Independent JPEG Group. Retrieved 2021-01-25.
  2. ^ Friesenhahn, Bob (June 6, 2020). "Re: [Libjpeg-devel-6x] 4 Integer Overflow Errors in libjpeg-9c". SourceForge.net. SourceForge. Retrieved 2021-01-25. The only concern was that Guido Vollbeding is not likely subscribed to this list and IJG JPEG is essentially developed by one person.
  3. ^ "Independent JPEG Group". Retrieved 27 January 2024.
  4. ^ JPEG JFIF
  5. ^ Jpegcrop Preferences and Options description
  6. ^ Filmic Games >> The greatest failure of our patent system was... Archived 2012-09-01 at the Wayback Machine
  7. ^ 680385 - Firefox does not show arithmetic coded jpegs
  8. ^ New jpegtran features
  9. ^ JPEG homepage
  10. ^ "libjpeg-turbo". libjpeg-turbo.
  11. ^ a b André Kramer (heise.de-Newsticker), January 14, 2013: Mozilla-Encoder verbessert JPEG-Kompression
  12. ^ Sebastian Grüner, 16. Juli 2014: MozJPEG 2.0: Facebook unterstützt JPEG-Encoder von Mozilla
  13. ^ "CloudFlare möchte zu Mozillas JPEG-Encoder beitragen". 30 July 2014.
  14. ^ a b "ISO/IEC 10918-7:2019 Information technology — Digital compression and coding of continuous-tone still images — Part 7: Reference software". ISO."T.873 (05/19): Information technology - Digital compression and coding of continuous-tone still images: Reference software". www.itu.int.
  15. ^ "Introducing Jpegli: A New JPEG Coding Library". Google Open Source Blog. 3 April 2024. Archived from the original on 3 April 2024. Retrieved 4 April 2024.
  16. ^ a b "libjpeg: API/ABI changes review". Retrieved 2017-10-28.
  17. ^ a b Mans Rullgard (Hardwarebug.org), August 4, 2009: IJG is back Archived 2014-07-16 at the Wayback Machine
  18. ^ a b Tom Lane, January 16, 2013: jpeg-9, API/ABI compatibility, and the future role of this project
  19. ^ a b "What About libjpeg v9?". libjpeg-turbo team. Retrieved February 8, 2013.
  20. ^ Mans Rullgard (Hardwarebug.org), February 1, 2010: IJG swings again, and misses
  21. ^ "ITU-T T.81 (JPEG-1)-based still-image coding using an alternative arithmetic coder" (pdf). September 2009.
  22. ^ a b "libjpeg-turbo | About / A Study on the Usefulness of DCT Scaling and SmartScale". libjpeg-turbo.org.
  23. ^ ITU-T JPEG-Plus Proposal R3
  24. ^ Evolution of JPEG
  25. ^ JPEG 9 Lossless Coding
  26. ^ "Libjpeg". GitHub. 6 October 2021.
  27. ^ Software That Uses or Provides libjpeg-turbo. February 9, 2012.
  28. ^ Issue 48789 – chromium – Use libjpeg-turbo instead of libjpeg. April 14, 2011.
  29. ^ Bug 698519 – Update to libjpeg-turbo 1.2. February 28, 2012
  30. ^ libjpeg for F14. February 9, 2012.
  31. ^ libjpeg-turbo README file Archived 2018-12-14 at the Wayback Machine
  32. ^ "Releases · mozilla/mozjpeg". github.com. Retrieved 2022-08-14.
  33. ^ Andreas Donath (golem.de), March 6, 2014: Mozilla will JPEGs besser komprimieren
  34. ^ "Introducing Jpegli: A New JPEG Coding Library". Google Open Source Blog. 3 April 2024. Archived from the original on 3 April 2024. Retrieved 4 April 2024.
  35. ^ "Jpeg - Jpeg Xt".