Image : connaître la couleur des pixels et réduction

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Image : connaître la couleur des pixels et réduction

Message par blendman »

Salut

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
N1 étant donc la réduction qu'on choisit.

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" :
Image


avec le paramètre 2 couleurs :
Image

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
Une idée pour faire ça(créer une sorte de palette de couleurs indexées ou des couleurs les plus utilisées) ?
merci :)
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image : connaître la couleur des pixels et réduction

Message par Ar-S »

Coucou,
As tu simplement essayé avec EncodeImage() pour voir ce que ça donne en 1 4 et 8 bits ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Image : connaître la couleur des pixels et réduction

Message par blendman »

J'avais testé mais ça ne marche pas.
J'utilise essentiellement des PNG, donc, je dois être en 32 bits, sinon, je n'ai pas de canal alpha.
Avatar de l’utilisateur
Guillot
Messages : 532
Inscription : jeu. 25/juin/2015 16:18

Re: Image : connaître la couleur des pixels et réduction

Message par Guillot »

et pourquoi tu n'utilise pas le format jpg2000 ?
il gere la couche alpha
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Image : connaître la couleur des pixels et réduction

Message par blendman »

J'utilise AGk pour créer mes jeux, et AGk ne permet que le jpg et png, rien d'autre ^^.

Sinon, j'ai trouvé une technique pour connaitre le nombre de couleur et même le nombre de fois où elles sont utilisées :
j'utilise une map()

Code : Tout sélectionner


If StartDrawing(ImageOutput(image))
    
    ; DrawingMode(#PB_2DDrawing_AlphaBlend) ; uncomment to get the alpha parameters
    
    max_x = ImageWidth(image) - 1    
    max_y = ImageHeight(image) - 1
    
    For y = 0 To max_y
      
      For x = 0 To max_x
        color = Point(x,y)       
        ZeColor(Str(color)) + 1 
      Next
    Next
    StopDrawing()
  EndIf
  
  
   ForEach ZeColor()
     key$ = MapKey(ZeColor())
     Debug "couleur :  "+key$ + " / nb : "+ZeColor()
  Next
  
  
  Debug "nb colors: "+MapSize(ZeColor())
C'est tout bête mais ça marche :).

Maintenant, il me reste à mettre dans mon image finale que les couleurs les plus utilisées ^^.
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Image : connaître la couleur des pixels et réduction

Message par comtois »

un algo écrit avec PureBasic (pas testé, je ne sais pas ce que ça vaut)

https://rosettacode.org/wiki/Color_quan ... #PureBasic
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: Image : connaître la couleur des pixels et réduction

Message par Mesa »

Une astuce à essayer: Tranformer un png en gif, qui va réduire le nombre de couleur (en créant une palette) tout en gardant l'alpha puis transformer le gif en png.

M.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Image : connaître la couleur des pixels et réduction

Message par blendman »

comtois a écrit :un algo écrit avec PureBasic (pas testé, je ne sais pas ce que ça vaut)
https://rosettacode.org/wiki/Color_quan ... #PureBasic
j'ai testé et ça change beaucoup trop les couleurs pour un poids pas forcément intéressant.
Une astuce à essayer: Tranformer un png en gif, qui va réduire le nombre de couleur (en créant une palette) tout en gardant l'alpha puis transformer le gif en png.
Heu comment tu fais ça de transformer l'image en gif puis en png dans purebasic ?

Bon, le soucis, c'est que tu n'as aucune maitrise sur le processus, tu ne peux régler le nombre de couleur (image) et de couleur pour la couche alpha. Mais pourquoi pas, à tester ^^

Moi, c'est ce que je fais et ça me permet de diviser par 4 le poids de mes png tout en conservant une image de qualité.

(PNggauntlet peut aller se rhabiller d'ailleurs. Je l'ai testé et mon logiciel est 10 fois plus intéressant niveau poids et qualité ^^).

C'est quand même dingue que je ne trouve aucun soft qui permettent de faire ce que le mien fait (mais moi, c'est imparfait, ça marche avec au moins 16 couleurs, en dessous, les couleurs sont un peu altérées aussi).

Il y a xnview qui permet d'avoir des couleurs indexées, mais on a peu de choix (8 couleurs, 16,32,64, etc...) et il ne conserve pas le canal alpha...
Répondre