Il y a quelques temps, sur une idée de Dobro (merci à lui ), j'ai réalisé un petit soft pour réduire le poids de mes images png (ou jpg) que j'utilise dans mes jeux, pour que mes jeux pèsent moins lourds sans trop de perte de qualité .
En gros, l'algo que j'utilise ressemble à ça :
Code : Tout sélectionner
If StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
; on stocke dans un tableau les pixels
For i = 0 To w-1
For j = 0 To h-1
color = Point(i,j)
a = Alpha(color)
r = (Red(color)/n1)*n1
g = (Green(color)/n1)*n1
b = (Blue(color)/n1)*n1
OriginalImageBase(i,j) = RGBA(r,g,b,a)
Next
Next
StopDrawing()
EndIf
Le problème c'est que ça ne fonctionne bien qu'avec + de 16 couleurs.
Si je réduis trop, je n'ai plus du tout les bonnes couleurs.
Avec le paramètre 16 "couleurs" :
avec le paramètre 2 couleurs :
Punaise, on voit que ça merdouille
Bon, c'est normal, l'algo arrondit les couleurs.
Voici donc ce que j'aimerai faire :
- créer une sorte de palette avec les couleurs les plus utilisées (couleurs indexées) et ensuite, c'est sur cette palette que je réduis les couleurs.
Savez-vous comment on peut connaître les couleurs les plus utilisées d'une image ?
J'ai essayé ça, mais c'est épouvantable de lenteur ^^
Code : Tout sélectionner
If StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
; on stocke dans un tableau les pixels
For i = 0 To w-1
For j = 0 To h-1
color = Point(i,j)
a = Alpha(color)
If a > 0
; on va stocker la couleur du pixel
ok = 0
; on vérifie si on a déjà cette couleur
For k =0 To ArraySize(ZeColor())
If ZeColor(k)\color = color
ZeColor(k)\nb +1
ok = 1
Break
EndIf
Next
If ok = 0
; on ajoute une Case de couleur ds notre tableau
k = ArraySize(ZeColor())+1
ReDim ZeColor.sColor(k)
ZeColor(k)\color = color
ZeColor(k)\nb = 1
EndIf
EndIf
Next
Next
StopDrawing()
EndIf
merci