Effectivement, mon post qui parle de sélection laisse croire que les couleurs sont indexées, ce qui n'est pas le cas (par contre sur le gif c'était le cas, du coup c'était vraiment un simple masque)
Sur le png, il y a un canal alpha, c'est à dire qu'au lieu de coder les couleurs sur trois canaux RVB (3*8 bits=24 bits), on code la couleur sur 32 bits. => RVBA, avec A pour alpha.
C'est à dire que pour chaque pixel, on a une information de couleur sur 24 bits et une information de transparence sur 8 bits (32 bits au total)
La sélection du blanc lors de l'enregistrement n'est qu'un raccourci d'interface utilisateur, qui fixe le canal alpha de chaque pixel blanc à "tout transparent" (genre 0 ou 255, je sais plus

) et qui laisse tous les autres pixels de l'image complètement opaques.
Ça donne quelque chose de ce genre :
for (y= 0 ; y < height ; ++y ) {
for (x= 0 ; x < width ; ++x ) {
p= pixels[x][y] ;
if ( p.r == 0xff && p.g == 0xff && p.b == 0xff ) { // pixel blanc, c'est la couleur choisie par l'utilisateur
p.a= 0 ;
}
}
}
saveToFile() ;