• [^] # Re: WebP sans perte et exact

    Posté par (site web personnel, Mastodon) . En réponse à la dépêche Des formats d'image. Évalué à 8.

    Les formats d'image sont faits pour permettre de restituer une image de façon à ce que nous la percevions de façon acceptable (avec perte), indiscernable de l'originale (avec pertes imperceptibles), ou identique à l'originale (sans perte perceptible ni mesurable).

    C’est pour cela que je ne parle que du « WebP sans perte » et du « PNG sans perte ». Je ne discute pas des formats avec pertes dont les algorithmes supposent un usage bien précis et donc une seule opération de rendu de couleur pour élaborer les optimisations. Si le format a besoin de supposer un usage précis, c’est peut-être qu’on ne fait déjà plus du « sans perte ».

    Même pour pour sauvegarder une image pensée pour être affichée sur le web, un graphiste peut vouloir un format « sans perte » qui ne détruise pas les pixels transparents, parce qu’il peut vouloir éditer la transparence plus tard pour révéler la couleur (ou laisser à un autre la possibilité de le faire).

    Quand aux autres canaux discutés, ce ne sont pas vraiment « autre choses que des images », ou du moins tout n’est pas « autre chose que des images ». Dans les cas que j’ai évoqués, tous les pixels de tous les canaux codent des données pour les mêmes pixels que les canaux rouge, vert, bleu et alpha, de la même manière que le canal alpha code l’opacité. Ce sont des données supplémentaires pour ces mêmes pixels, ce sont donc des canaux supplémentaires pour ces images.

    L’opacité stockée dans le canal alpha n’est déjà pas « une image » en soit.

    Comme l’a relevé marzoul, on peut imaginer coder l’opacité avec 3 canaux alpha : rouge, vert, et bleu, pour par exemple ne laisser passer que le rouge par transparence et rester opaque aux autres couleurs, plutôt que de supposer de n’avoir un seul canal de transparence égal à toutes les couleurs.

    Les canaux rouge, vert, bleu sont pensés pour de l’affichage opaque sur écran. Le canal alpha a surtout été pensé pour le web, pour se passer de CSS dans la majeure partie des cas (détourage, opacité). Mais ce canal alpha fait des suppositions très fortes : que tous les canaux de couleur soient identiques en alpha, et que l’opération de mélange soit toujours la même. Certains formats comme le GIF n’avaient qu’1 seul bit de transparence, donc ça ne servait qu’au détourage. Le web avait besoin de plus que ça, le canal alpha répond vite-fait au besoin, mais pour une seule fonction, avec un seul canal pour toutes les couleurs, « ça fera l’affaire ».

    Les formats d'image sont faits pour [...]

    Ces formats d’image ne sont faits que pour le web à l’époque d’HTML 4. FTFY =)

    Si on commence à utiliser ça pour autre chose que des images, c'est du détournement de la fonction du format,

    Ce n’est pas du détournement de la fonction du format, c’est un ajout de données et d’opérations. Même avec une image qui code des données rouge, vert, bleu dans les canaux rouge, vert, bleu, on peut destiner ces couleurs rouge, vert, bleu à autre chose qu’une seule et même opération de mélange. Par exemple on peut faire une addition. Une « carte d’addition », c’est exactement ça : une image avec des canaux rouge, vert, bleu, mais l’opération utilisée n’est pas celle utilisée par le navigateur quand on fait <img src="image.png"/>, les couleurs seront additionnées.

    Il était courant, à une époque où les formats d’images avec canal alpha n’étaient pas autant répandus, de stocker le canal alpha dans une autre image que celle qui stocke les canaux rouge, vert, bleu. Par exemple certains jeux peuvent distribuer les canaux rouge, vert, bleu, dans une image JPEG, puis le canal alpha dans une seconde image JPEG.

    Il existe des formats avec pertes qui n’attribuent pas la même précision pour chaque canal. Par exemple on peut imaginer un format couleur et opacité de seulement 16 bits (au lieu de 32 bits) qui attribuerait 3 bits pour le rouge, 3 bits pour le vert, 2 bits pour le bleu, et 8 bits pour l’opacité. Il est courant d’échanger les canaux, par exemple de stocker le vert dans l’alpha si on veut 8 bits de précision pour le bleu. Ces formats d’image avec pertes fournissent éventuellement des métadonnées qui renseignent ces échanges de canaux.

    Voici quelques exemples d’attribution de canaux avec des textures du jeu Xonotic :

    ivy.jpg ivy_alpha.jpg ivy_gloss.jpg ivy_norm.jpg
    JPEG Rouge: Couleur Rouge JPEG Rouge: Opacité JPEG Rouge: Spécularité Rouge JPEG Rouge: Normale X
    JPEG Vert: Couleur Vert JPEG Vert: Spécularité Vert JPEG Vert: Normale Y
    JPEG Bleu: Couleur Bleu JPEG Bleu: Spécularité Bleu JPEG Bleu: Normale Z
    black-tiles-mossy_norm.jpg black-tiles-mossy_norm.jpg black-tiles-mossy_norm_alpha.jpg
    JPEG Rouge: Couleur Rouge JPEG Rouge: Normale X JPEG Rouge: Profondeur
    JPEG Vert: Couleur Vert JPEG Vert: Normale Y
    JPEG Bleu: Couleur Bleu JPEG Bleu: Normale Z
    pk02_floor07.tga pk02_floor07_gloss.tga pk02_floor07_norm.tga
    TGA Rouge: Couleur Rouge TGA Rouge: Spécularité Rouge TGA Rouge: Normal X
    TGA Vert: Couleur Vert TGA Vert: Spécularité Vert TGA Vert: Normal Y
    TGA Bleu: Couleur Bleu TGA Bleu: Spécularité Bleu TGA Bleu: Normal Z
    TGA Alpha: Opacité TGA Alpha: Profondeur
    pk02_light02a.tga pk02_light02a_glow.tga pk02_light02a_gloss.tga pk02_light02a_norm.tga
    TGA Rouge: Couleur Rouge TGA Rouge: Addition Rouge TGA Rouge: Spécularité Rouge TGA Rouge: Normal X
    TGA Vert: Couleur Vert TGA Vert: Addition Vert TGA Vert: Spécularité Vert TGA Vert: Normal T
    TGA Bleu: Couleur Bleu TGA Bleu: Addition Bleu TGA Bleu: Spécularité Bleu TGA Bleu: Normal Z
    TGA Alpha: Profondeur

    ce commentaire est sous licence cc by 4 et précédentes