Dropbox a récemment publié Lepton ( GitHub ), une méthode qui compresse sans perte les images JPEG aller-retour, économisant en moyenne 22%.
En raison du principe du pigeonhole , aucun algorithme de compression général ne peut garantir un fichier plus petit ( général car il ne s'applique pas aux entrées limitées à un format spécifique). Lepton exploite les caractéristiques communes des JPEG, qui, si elles étaient subverties, pourraient le classer pour produire un fichier plus grand que la source.
Exigences
Écrivez un programme qui génère:
- Une image JPEG / JFIF valide,
- d'une taille comprise entre 0,5 Mo et 1 Mo,
- pas plus petit que 256 × 256 px,
- pas plus grand que 4096 × 4096 px,
- reconnaissable par Lepton (il peut "compresser" avec succès une
.lep
image), et - décompresse à un identique
.jpg
(comme l'entrée). APPx
,COM
et d'autres métadonnées, les sections de marqueur non graphique sont limitées dans le JPEG (l'injection de quantités arbitraires d'octets aléatoires dans l'image pour approcher asymptotiquement la compression 1: 1 est boiteuse.)- un
APP0
marqueur JFIF est autorisé mais aucune vignette n'est autorisée (devrait être exactement 16 octets) - tl; dr Si vous ne placez pas intentionnellement des métadonnées dans un segment EXIF et que vous désactivez toute sorte de miniature que votre bibliothèque de langues de choix souhaite mettre dans l'image, cela devrait être OK.
- un
Postez le code et l'image.
Si vous voulez écrire un programme qui produit une image Lepton qui, une fois convertie, produit un JPEG répondant aux critères, c'est très bien. Elle doit rester identique sur plusieurs cycles JPEG → Lepton → JPEG → ... arbitrairement.
Notation
La taille en octets de l'image Lepton divisée par l'image JPEG source. Une valeur plus élevée (pire compression Lepton) est meilleure. Exécutez Lepton avec des indicateurs et des commutateurs par défaut.
Obtenir Lepton
Un cours intensif de 5 secondes pour construire Lepton:
git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make
# fish shell: ./autogen.sh ;and ./configure ;and make
Alors ./lepton --help
devrait vous dire des choses.
Réponses:
Python 3 + mozjpeg + / dev / urandom, 720 × 720: moy. score 102%
Dépend du
mozjpeg
package, le code suppose qu'il est installé dans/usr/local/opt/mozjpeg
. (sous OS X, c'est simple à installer, il suffit de l'exécuterbrew install mozjpeg
)Cela dépend également du
/dev/urandom
fichier spécial, il est utilisé pour générer des données aléatoires.Le code
mozjpeg
fournit simplement des données aléatoires au compresseur (au format TGA, car cjpeg le comprend et il a un en-tête très simple), et lui permet de créer un fichier jpeg optimisé. La qualité est définie au maximum car elle rend les coefficients DCT les moins compressibles, et peu importe l'algorithme utilisé pour compresser les données non compressibles.J'ai vérifié que le cycle jpeg-> lepton-> jpeg est sans perte - c'est vrai.
Le code n'est pas joué, évidemment.
Exemple d'image:
Fait amusant: le fichier JPEG généré est plus grand que l'image TGA non compressée source, même si JPEG utilise une compression avec perte.
Fait amusant 2: Imgur (l'hébergement d'images par défaut pour SO) fait un très mauvais travail dans ce fichier - pour une raison quelconque, il le recompresse en qualité inférieure, même s'il est inférieur à 1 Mo. J'ai donc utilisé Github pour télécharger l'image d'exemple.
Fait amusant 3: En général, mozjpeg fait en effet une meilleure compression JPEG tout en restant compatible avec les décodeurs JPEG existants. Et il a également un outil pour optimiser sans perte les fichiers JPEG, aussi -
jpegtran
.la source
Bruit naïf, 1024 × 1024: score 85,55%
Un exemple conforme en Python pour faire bouger les choses. Pas optimisé en aucune façon; lacunes probables:
Ensuite, quelques coups pour faire la chose:
la source