Alléger une image ??

août 2006 modifié dans Objective-C, Swift, C, C++ #1
Bonsoir,

je vous expose la petite astuce. Bien que par dessus, j'aimerai des explications et des éclaircissements car ça me paraà®t un peu trop "gros" comme astuce  ::)

J'ai découvert qu'en utilisant
<br />representationUsingType:NSJPEGFileType properties:nil

de NSBitmapImageRep, on arrive à  alléger le fichier sans perdre la qualité.

"Olala, t'emballes pas coco, c'est impossible".. Mais pourtant, j'ai beau comparer l'image originale et celle enregistrée avec NSBitmapImageRep... je ne vois pas...

Avec ça, une image qui pèse 80Ko (via photoshop) peut atteindre les 4Ko (via NSBitmapImageRep)... Comment est-ce possible ?  B)

Ci-joint, un petit programme que je viens de faire (juste pour vous montrer) ainsi que le code source.

@+
Louka

[Fichier joint supprimé par l'administrateur]

Réponses

  • AliGatorAliGator Membre, Modérateur
    août 2006 modifié #2
    Le format JPEG sans perte, ça existe.
    Bon ok c'est très peu utilisé car il a pas été inventé pour ça, mais ça existe. Il suffit de ne pas effectuer la quatification dans l'algo de compression JPEG.

    L'algo JPEG si je n'oublie rien c'est en gros :
    1. Conversion des données en YUV 4:2:2 et découpage en macroblocs et blocs 8x8
    2. Appliquer une DCT sur ces blocs
    3. Quantification (dépend du facteur de qualité choisi, c'est là  que ça compresse avec perte)
    4. Encodage Huffman

    Il y a donc compression avec perte à  l'étape 3 puis compression du résultat (qui en général contient pas mal de zéros) sans perte à  l'étape 4

    Ce qu'on appelle parfois le "JPEG lossless" c'est quand on saute l'étape 3. C'est assez rare, ça consite à  se contenter du codage entropique (Huffman), mais ça compresse quand même un peu par rapport an BMP donc bon. C'est juste que ça atteint des taux de compression bien moins importants qu'avec le JPEG avec pertes (car la quantization permet d'obtenir beaucoup de zéros sur le parcours ZigZag de la DCT une fois quantifiée, et le nombre de niveaux est plus réduit aussi, donc le codage Huffman est vraiment efficace, alors que sinon -- JPEG lossless -- tu as beaucoup de niveaux différents donc un codage entropique a moins d'effet)

    Bon après je sais pas si le code que tu cite fait vraiment du JPEG lossless, mais ça correspond à  la façon dont tu décris la chose.
Connectez-vous ou Inscrivez-vous pour répondre.