JPEGは非可逆、PNGは可逆と言う嘘
JPEGは非常にややこしい規格で、複数のモードが実装されている。プログレッシブ、算術符号、ロスレスなどがオプションで実装されている。しかし、実装されているのと使われて居るのは違う。例えば、算術符号は特許がガチガチだった関係で実装を回避してきた経緯があるので、あまり使われて居ない。当時のPCのメモリと速度的な理由で実装が難しいと言う別の理由もある。
https://www.w3.org/Graphics/JPEG/itu-t81.pdf
このロスレスモードと言うのが可逆圧縮になるわけである。実はJPEGは非可逆と可逆の両方をサポートしている。
しかしながら、サポートしているエンコーダーとデコーダーが、あまり無いので使われていないだけだ。JPEGのライブラリlibjpegにロスレス圧縮が実装されたのはなんと2013年。JPEGの規格書が公開されてから11年も経っている。PNGは1995年に登場しているから当然インターネットで可逆圧縮といえばPNGになっているし、大半の画像ツールには未だに実装されていない。
確認のため検索するとレベルの低い技術ブログqiitaにロスレスJPEGという嘘記事が書いてある始末。そこに書いてあるのはロスレスJPEGではなく、JPEGの無劣化再圧縮だ。
それではJPEGとPNGの違いはなんであろうか?実は設計思想だ。JPEGがハードウェア化や電送など前提など広い用途を対象として作られているのに対し、PNGはインターネットしか考慮していない。既存のライブラリ(zlib)を利用しており実装コストが小さいのもPNGの設計思想が良く出ている。
この思想はファイルの一部が破壊されたときに現れる。JPEGは一部のデータが欠損してもなんとかファイルが表示できるような機能が実装されている(——とはいえ実際に実装しているエンコーダーはあまり多く無いのだが)、一方PNGはエラー修復はインターネットのプロトコルに依存している。
一方、インターネットを意識したPNGはGIFをフルーカラー版という位置づけがあり透明化情報を最初から持っている。アニメーションも実装可能だが拡張機能なのとサイズが大きくなるのを嫌ったのかあまり普及していない。未だにGIFが使われている。