LoadSprite et des fichiers avec et sans couche Alpha

Programmation d'applications complexes
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Thyphoon

Le process correct consiste à chercher IHDR (comme Case préconise) puis à repérer ce fameux octet qu'est le type de couleur. Je t'ai traduit la section correspondante.

Ollivier


(Traduction de la section 11.2.2. de la recommandation W3C du 10 Novembre 2003)

11.2.2. En-tête d'image IHDR

La champ de 4 octets fournissant le type de bloc contient les valeurs décimales suivantes :

73 72 68 82

Le bloc IHDR sera toujours le premier bloc dans le fichier PNG. Il contient:

Code : Tout sélectionner

* La largeur : 4 octets
* La hauteur : 4 octets
* La profondeur en bits : 1 octet
* Le type de couleur : 1 octet
* La méthode de compression : 1 octet
* La méthode de filtration : 1 octet
* La méthode d'entrelacement : 1 octet
Largeur et hauteur donnent les dimensions de l'image en pixels. Ce sont des entiers non signés de 4 octets. Zéro est une valeur invalide.

La profondeur en bits est un entier simple de 1 octet donnant le nombre de bit par composante ou par index de palette (et non pas par pixel). Les valeurs valides sont 1, 2, 4, 8 et 16, néanmoins toutes les valeurs ne sont pas permises pour tous les types de couleur. Cf le tableau 6.1.

Le type de couleur est un entier simple de 1 octet qui définit le type d'image PNG. Les valeurs valides sont 0, 2, 3, 4 et 6.

Les restrictions de la profondeur en bits pour chaque type de couleur sont imposées pour simplifier l'implémentation et non pas pour prohiber les combinaisons qui auraient une mauvaise compression. Les combinaisons permises sont définies dans la table 11.1.

Table 11.1 - Combinaisons permises des types de couleurs et des profondeur en bits

Code : Tout sélectionner

Type 	      Type de  Profondeurs  Interprétation
d'image 		couleur  permises
PNG                    en bits

Niveaux 		0		  1,2,4,8,16   Chaque pixel est une composante 
de gris                             de niveau de gris

Couleurs      2		  8,16         Chaque pixel est un triptique
réelles                             de composantes R, V, B

Couleurs      3		  1,2,4,8      Chaque pixel est un index de 
indexées	                         palette. Un bloc PLTE devra
                                    apparaître dans le fichier 

Niveaux       4		  8,16         Chaque pixel est une composante
de gris  							      de niveau de gris suivie d'une
avec canal                          composante alpha
alpha

Couleurs      6		  8,16         Chaque pixel est un triptique 
réelles                             R, V, B suivi
avec canal 							    d'une composante alpha
alpha

La profondeur de composante est la même que la profondeur en bits exceptée dans le cas des couleurs indexées (type de couleur n°3), dans lequel la profondeur de composante est toujours de 8 bits (Cf 4.4: Images PNG, le schtroumpf avec une clé anglaise)

La méthode de compression est un entier simple de un octet qui indique la méthode utilisée pour compresser les données des images. Seule la méthode de compression n° 0 (compression deflate/inflate avec une fenêtre max de 32768 octets) est définie dans ce standard international. Toutes les images conformes au format PNG seront compressées sur ce principe.

La méthode de filtration est un entier simple de un octet qui indique la méthode de préprocession appliquée aux données de l'image avant la compression. Seule la méthode de filtration n° 0 (filtration adaptative avec 5 types de filtre de base) est définie dans ce standard international. Cf clause 9: Filtration, pour plus de détails.

La méthode d'interface est un entier simple de 1 octet qui indique l'ordre de transmission des données de l'image. Deux valeurs sont définies dans le standard international: 0 (pas d'interface) ou 1 (Entrelacement Adam7). Cf clause 8: Entrelacement et extraction de passe, pour plus de détails.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci beaucoup Ollivier... Je comprends beaucoup mieux... Et si j'ai bien tout compris on pourrait même rajouter ReadByte(0) = 4

Code : Tout sélectionner

ReadFile(0, Filename.s )
    FileSeek(0, 25)
    If ReadByte(0) = 6 [b]or ReadByte(0) = 4[/b]
      Debug "Couche alpha" 
  endif
closefile(0)
dans le cas d'une image en niveaux de gris avec canal alpha

Meric beaucoup pour cette traduction... J'éspère que la prochaine fois je m'en sortirais tout seul :P
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Ollivier a écrit :Ici, il y a des infos sur le PNG.

Code : Tout sélectionner

ReadFile(0, OpenFileRequester("", "", "*.PNG", 0) )
FileSeek(0, 25)
If ReadByte(0) = 6: Debug "Couche alpha": EndIf
CloseFile(0)
merci pour ce précieux petit code :)
l'image doit être en 32bit( calque de fond masqué lors de l'enregistrement)


seul sprite3dblendingmode(5,7) fonctionne véritablement alors ?
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

je confirme, seul le (5,7) fonctionne.
Le problème, c'est que cela bave, voilà pourquoi j'utilise le (5,4). Mais avec une image avec couche alpha, le (5,4) donne un affichage curieux( dans un carré sombre). J'ai du récupérer mes sauvegardes pour tout retrouver à l'état premier, ouf, j'ai eu chaud !


edit:
le (5,2) fonctionne également, mais çà bave( un halo rouge sur un fond rouge par exemple).

Pourquoi le (5,4) ne fonctionne pas avec une vrai image alpha ? mystère...

j'ai testé à tout hasard en convertissant en .tga, et le résultat est rigolo( un beau masque blanc englobant l'image, quoi qu'on fasse).

dans le manuel:
Active le support du format PNG (Portable Network Graphic) pour les commandes SaveImage() and SaveSprite(). Le format PNG utilise un algorithme de compression non-destructif, ce qui veut dire que l'intégralité de l'information est conservée. C'est actuellement le meilleur format pour stocker des images sans perte d'information. Si une couche alpha (alphachannel) est présente dans l'image, elle ne sera pas prise en compte.
...pas prise en compte, pas glop.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Répondre