Page 1 sur 3

Comment réduire le nombre de couleurs d'une image

Publié : dim. 18/juin/2017 18:16
par Shadow
Salut,

Voici un court tuto pour réduire la taille de vos image tout en ayant une qualité excellente.
Cependant, nous allons réduire le nombres d'informations de l'image, plus exactement le nombre de couleurs.

Passez votre image avec ce code, celui-ci va mettre toute les valeur RGBA en Pair.
Il supprime également toute les valeurs 0 pour un future usage (Non implémenté).

Ainsi, on réduit déjà le nombre de couleurs de l'image par 2 !
Attention, image supporté seulement BMP et PNG pour ce code. (Il va y avoir des râleurs je le sens ^^)

Code : Tout sélectionner

; Créé le 18/06/2017 par Dieppedalle David.

Enumeration 1
  #Image
EndEnumeration

Global FichierImage$ = ""

; Procédure de chargement d'une image
Procedure.l ChargementImage(NumeroImage, FiltreDefaut)
  
  Chargement_Image:
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpg (*.Jpg)|*.Jpg"
  FichierImage$ = OpenFileRequester("Choisissez un fichier à charger", GetHomeDirectory() + "Bureau\", Filtre$, FiltreDefaut)
  
  If FichierImage$
    
    If FindString(LCase(GetFilePart(FichierImage$)), ".bmp", 1)
      ; Ok
      
    ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".png", 1)
      UsePNGImageDecoder()
      
    ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".jpg", 1)
      MessageRequester("Fichier invalide !", "      Le format Jpg n'est pas supporté dans ce code !", 48)
      ProcedureReturn 0
      
    Else
      MessageRequester("Fichier invalide !", "      Veuillez choisir un fichier d'image invalide !", 48)
      ProcedureReturn 0
    EndIf
    
    If LoadImage(NumeroImage, FichierImage$) <> 0
      ProcedureReturn LoadImage(NumeroImage, FichierImage$)
    Else
      MessageRequester("Erreur de chargement !", "      Impossible de charger le fichier " + Chr(34) + GetFilePart(FichierImage$) + Chr(34) + " !", 16)
      ProcedureReturn 0
    EndIf
    
  EndIf
  
  ProcedureReturn 0
EndProcedure

; Procédure pour lire l'image
Procedure LireImage()
  
  If ChargementImage(#Image, 1)
    
    LargeurImage.i = ImageWidth(#Image)
    HauteurImage.i = ImageHeight(#Image)
    ProfondeurImage.i = ImageDepth(#Image)
    
    StartDrawing(ImageOutput(#Image))
    
    For Y.i = 0 To HauteurImage.i - 1
      
      For X.i = 0 To LargeurImage.i - 1
        
        ; Extraction de la couleur du Pixel.
        Couleur.q = Point(X.i, Y.i)
        
        ; Met toute les valeurs du Pixel à Pair.
        Rouge.i = (Red(Couleur.q) / 2) * 2
        Vert.i = (Green(Couleur.q) / 2) * 2
        Bleu.i = (Blue(Couleur.q) / 2) * 2
        
        ; Pas de valeur 0 car sera réservé.
        If Rouge.i = 0
          Rouge.i = 2
        EndIf
        
        If Rouge.i > 255
          Rouge.i = 254
        EndIf
        
        ; Pas de valeur 0 car sera réservé.
        If Vert.i = 0
          Vert.i = 2
        EndIf
        
        If Vert.i > 255
          Vert.i = 254
        EndIf
        
        ; Pas de valeur 0 car sera réservé.
        If Bleu.i = 0
          Bleu.i = 2
        EndIf
        
        If Bleu.i > 255
          Bleu.i = 254
        EndIf
        
        If ProfondeurImage.i = 32
          
          Alpha.i = (Alpha(Couleur.q) / 2) * 2
          
          ; Pas de valeur 0 car sera réservé.
          If Bleu.i = 0
            Bleu.i = 2
          EndIf
          
          If Alpha.i > 255
            Alpha.i = 254
          EndIf
          
        EndIf
        
        ; Remplace le nouveau Pixel.
        Plot(X.i, Y.i, Rouge.i + Vert.i * 256 + Bleu.i * 65536 + Alpha.i * 16777216)
        
      Next
      
    Next
    
    NomFichier$ = GetFilePart(FichierImage$, #PB_FileSystem_NoExtension)
    ExtentionFichier$ = GetExtensionPart(FichierImage$)
    CheminFichier$ = GetPathPart(FichierImage$)
    
    If ImageFormat(#Image) = #PB_ImagePlugin_BMP
      
      ; Remplace l'image pour la nouvelle.
      If SaveImage(#Image, CheminFichier$ + NomFichier$ + " Réduit." + ExtentionFichier$, #PB_ImagePlugin_BMP)
        Debug "ok"
      EndIf
      
    ElseIf ImageFormat(#Image) = #PB_ImagePlugin_PNG
      
      UsePNGImageEncoder()
      
      ; Remplace l'image pour la nouvelle.
      If SaveImage(#Image, CheminFichier$ + NomFichier$ + " Réduit." + ExtentionFichier$, #PB_ImagePlugin_PNG)
        Debug "ok"
      EndIf
      
    Else
      
    EndIf
    
  EndIf
  
EndProcedure

LireImage()
Ensuite ouvrez votre image avec GIMP et enregistrez la en PNG (GIMP a un algorithme bien meilleur que Paint)
Peut être que d'autres en on aussi, mais je prends GIMP car c'est lui que j'ai et qu'il est Gratuit.

Pour finir, télécharger: https://pnggauntlet.com/
Et passez votre image avec.

La taille de votre image à beaucoup réduit et ça en conservant quasiment ça qualité, pertes non visible.
Voilà !

Re: Tuto - Comment réduire la taille de vos image...

Publié : dim. 18/juin/2017 18:22
par SPH
C'est beau la simplicité :mrgreen:

Re: Tuto - Comment réduire la taille de vos image...

Publié : dim. 18/juin/2017 18:38
par JohnJohnsonSHERMAN
Edit : J'ai rien dit ;)

Re: Tuto - Comment réduire la taille de vos image...

Publié : dim. 18/juin/2017 18:44
par case
tout ça pour ça :twisted:

au final ton histoire de lissage tu l'utilise pas alors tu reprend ma méthode du byte/range*range qui ne te convenais pas
je m'attendais a un peu plus de ténacité ou au moins a un code qui n'utilise pas de programmes tiers

bref ...

comme d'hab, shadow et ses idées souflets :)


:mrgreen:

Re: Tuto - Comment réduire la taille de vos image...

Publié : dim. 18/juin/2017 18:56
par Shadow
ma méthode du byte/range*range
T'as rien inventé du tous hein :roll:
J'utilise cette méthode depuis déjà un bon bout de temps mon vieux.
C'est pas grâce à toi ni qui que se soit d'ailleurs alors rassure toi, je t'es rien piqué.

Et ensuite, parvient pas à faire mon lissage mais bref.

Re: Tuto - Comment réduire la taille de vos image...

Publié : dim. 18/juin/2017 20:04
par Ar-S
1ère chose : Ce n'est pas un tuto. Un tuto se veut explicatif (3 commentaires dans le code ne suffisent pas)
J'utilise cette méthode depuis déjà un bon bout de temps mon vieux.
C'est pas grâce à toi ni qui que se soit d'ailleurs alors rassure toi, je t'es rien piqué.
Et bien vivement tes prochaines demandes.. :roll:

Code : Tout sélectionner

If FindString(LCase(GetFilePart(FichierImage$)), ".jpg", 1)
Tu as GetExtensionPart() qui est fait pour ça.

Enfin j'ai fait 1 test avec cette image : http://share.ldvmultimedia.com/meganfox-1400.png de 1.95mo
Après "réduction", l'image : meganfox-1400 Réduit.png fait 2.25 mo..

Bref, de déplace ce sujet dans la section débutant. Le code ne marche pas forcement, ce n'est pas un "truc et astuce"..

Re: Comment réduire la taille d'une image

Publié : dim. 18/juin/2017 22:36
par Shadow
Alors toi t'es un bon, mais alors un bon ! :mrgreen:
Si tu avais lus correctement et pas en diagonale :roll:

Oui avec mon code, la taille de l'image augmente et d'ailleurs c'est intéressant
mais pas du tout anormale, si tu as enregistrer ton image avec photoshop ou autre, sauf paint...
Et si tu reviens avec mon code, bha forcement que ça va augmenter car l'algo de PB n'est pas optimisée !
Donc la taille de l'image augmente !

Alors dis moi, tu l'as chopper comment cette image là, et pourquoi celle-ci ?
Bon lis la suite tu va apprendre pleins de choses, aller !

Ensuite si tu avais passer cette image une fois le code passer sur l'image SUR GIPM EN PNG
tu aurais vue que la taille de l'image est passer à 1.56 Mo.

1.95 Mo -> 1.56

Donc mon code fonctionne bien, avec GIMP qui est meilleurs
que Paint et PB pour encoder l'image en PNG !

Et pour finir, si tu avait ensuite passer cette même image avec le logiciel PNGGauntlet et bien tu aurais pue voir
que l'image avait encore diminuer en taille, si si j'te jure !

Maintenant l'image fait: 1.36 Mo
Donc tu vois, Mr je lis de travers que l'image à bien diminuer en taille :wink:

1.56 -> 1.36

Totale: 1.95 -> 1.36 = -600 Ko env.

Re: Comment réduire la taille d'une image

Publié : lun. 19/juin/2017 8:21
par djes
Shadow, même si l'intention de faire un tutoriel est louable, nous savons également que derrière cela il y a aussi une volonté de faire passer en force ton idée, et le prétexte du tuto n'est pas suffisant pour garder ce sujet. En plus, la rubrique tuto doit quand même être un minimum documentée, bien rédigée, pour aider pas à pas le lecteur à bien utiliser le langage. Enfin, tu pêches toujours par cet insupportable manque de respect vis à vis des autres, ce qui finit par entraîner des réactions épidermiques néfastes à l'ambiance du forum.

Par exemple :
Shadow a écrit :Alors toi t'es un bon, mais alors un bon ! :mrgreen:
Attaque directe, c'est familier et insultant. Un bon quoi ? Et si on te disait la même chose ? Nous ne sommes pas dans une cour de récréation, tu t'adresses à des adultes, je te demande encore une fois d'écrire autrement.
Shadow a écrit :Si tu avais lus correctement et pas en diagonale :roll:
Encore une fois, c'est insultant. Tu aurais pu demander avant s'il avait bien compris ton code, et expliquer un peu mieux.
Shadow a écrit :Oui avec mon code, la taille de l'image augmente et d'ailleurs c'est intéressant
mais pas du tout anormale, si tu as enregistrer ton image avec photoshop ou autre, sauf paint...
C'est peut-être normal pour toi, mais imagine la tête d'un débutant.
Shadow a écrit :Et si tu reviens avec mon code, bha forcement que ça va augmenter car l'algo de PB n'est pas optimisée ! Donc la taille de l'image augmente !
Et pourquoi ? Est-ce que tu as le début d'une explication ? Sinon, il ne vaut mieux pas faire de tutoriel, car il faut maîtriser un sujet pour pouvoir l'expliquer.
Shadow a écrit :Alors dis moi, tu l'as chopper comment cette image là, et pourquoi celle-ci ?
Bon lis la suite tu va apprendre pleins de choses, aller !
Insultant, encore une fois. On ne dit pas ça, ce n'est pas respectueux.
Shadow a écrit : Ensuite si tu avais passer cette image une fois le code passer sur l'image SUR GIPM EN PNG
tu aurais vue que la taille de l'image est passer à 1.56 Mo.

1.95 Mo -> 1.56

Donc mon code fonctionne bien, avec GIMP qui est meilleurs
que Paint et PB pour encoder l'image en PNG !

Et pour finir, si tu avait ensuite passer cette même image avec le logiciel PNGGauntlet et bien tu aurais pue voir
que l'image avait encore diminuer en taille, si si j'te jure !

Maintenant l'image fait: 1.36 Mo
Donc tu vois, Mr je lis de travers que l'image à bien diminuer en taille :wink:
Franchement, il n'y a là rien d'exceptionnel, je ne vois pas ce qu'Ar-s pourrait apprendre.

En plus, tu utilises une pléthore de logiciels externes qui font le boulot à ta place. Sais-tu que tu peux directement faire cette réduction de couleurs dans ces logiciels ? Que tu peux également utiliser une trame ordonnée, qui facilite souvent la compression LZWH ? À quoi bon utiliser PB dans ce cas ?

Cela aurait été bien plus instructif si, de bout en bout, étape par étape, avec des graphiques illustrant le processus, tu avais montré comment fonctionnait un ou plusieurs algorithmes de compression d'image utilisé dans les formats de fichiers usuels, et ensuite, comment tu pouvais adapter ton image, en supprimant des informations peu sensibles, pour gagner encore un peu de place (sais-tu que la perception des couleurs est différente suivant les composantes, et que tu peux donc supprimer plus allègrement certaines couleurs que d'autres ?).

J'arrête là, j'espère que tu auras compris que ton attitude est irritante. Tu es capable de te corriger, de faire mieux. Comme tout le monde, tu n'as pas exploité tout ton potentiel, et pour le développer, c'est mieux d'avoir le soutien des autres, pas l'inverse.

Re: Comment réduire la taille d'une image

Publié : lun. 19/juin/2017 9:59
par Ar-S
Merci djes pour cette réponse pondérée. Je ne modèrerai pas un topic me concernant...

@Shadow
Alors dis moi, tu l'as chopper comment cette image là, et pourquoi celle-ci ?
Elle fait partie de mes fonds d’écran, j'en ai très peu en PNG. Tout simplement.

Le fond de ma pensée : Je n'ai pas lu ton sujet en diagonal.. Nous sommes là dans un forum de pure basique.
si ton programme nécessite de passer par Gimp ou autre logiciel, ton code ne sert à rien.
Encore une fois tu réduis le nombre de couleurs et tu recompresses via un autre soft, évidement que ça gagne un peu de place... Tu pourrais aussi convertir les couleur > 253 en 253 et refaire le processus, tu gagnerais encore quelques octets... Mais tu dénatures ton image en faisant cela !

Re: Comment NE PAS réduire la taille d'une image

Publié : lun. 19/juin/2017 11:20
par TazNormand
Bon, moi j'ai édité le titre en "Comment réduire le nombre de couleurs d'une image" car c'est clair que ton code ne réduit pas la taille du fichier !!!

Tu utilises PNGGauntlet : il utilise trois outils pour réduire la taille des PNG, dont notamment OptiPNG (que j'utilise régulièrement pour les images de site).

Ce que tu aurais du faire, c'est une passerelle vers les outils qu'utilise PNGGauntlet, comme OptiPNG, voir implémenter le code d'OptiPNG dans ton code.

Re: Comment réduire le nombre de couleurs d'une image

Publié : lun. 19/juin/2017 12:47
par Shadow
Salut,

Djes, merci, mais si j'ai fais ça c'est parce que je me suis sentie attaquer :oops:
Comment souvent, puisque souvent été le cas auparavant...

Je fais de mon mieux pour m’intégrer, je partages mes connaissances.
Je voudrait approfondir ce sujet et je voudrait de l'aide, pas qu'on face à ma place, je veux apprendre.

On me reproche mes réponses, mais quand je lis certaine je me sent parfois agressé...
Je comprends pas un truc aussi...

Pourquoi quand moi je me défends si je puis dire ça, m’exprime, et bien que j’apprécie beaucoup
qu'on me reprenne en douceur comme ici, car ça m'aide à évolué, pourquoi on me reprends alors que quand certain me parle
parfois méchamment, comme zorro, personne ne le reprends lui ?

Bref passons.

Ar'S je m'excuse de mon attitude, mais c'est vraiment dur pour moi parfois...
J’essaie de m'améliorer mais parfois ça m'énerve certaine réponses...

Bon, si ont rebondissais positivement sur ceci.
Ceci étais une astuce.

Re: Comment réduire le nombre de couleurs d'une image

Publié : lun. 19/juin/2017 14:22
par TazNormand
Normal que tu te sentes agressé car tes propos sont souvent brouillons, tu demandes de l'aide qui ne te convient jamais (cf aide de Case sur le lissage), et tu prends les autres membres de haut (vis à vis d'Ar-S par exemple).

Au final, tu proposes un tuto, qui n'en est pas un (0 commentaire dans le code, explications fumeuses sur le code), tu affirmes une qualité d'image excellente grâce à ton algo "miracle", mais je te l'ai dit pour le lissage, diminuer le nombre de couleur fait gagner en place, mais perdre en "qualité", c'est logique.

Et surtout, tu utilises des outils externes (j'exclue Gimp) qui font 90% du taf de compression de l'image. Si je prends des photos avec mon reflex, je veux bien que le PNG soit plus petit pour mettre sur une page Web, mais j'ai pas envie que l'image soit "fadasse".

Tu veux concurrencer le format JPG, tu as eu un début de réponse sur ton topic du lissage, sinon, intéresse-toi à ce format de fichier, et fait un wrapper : format BPG

Tu ne veux pas qu'on fasse à ta place, mais tu réclames très souvent des codes tout prêts fait... :roll: Cherche l'erreur

Et ce n'est pas parce que tu ne vois pas de message qui demande à un membre d'y aller mollo avec untel ou untel, qu'il n'a pas été recadré, les modos et les MP sont là pour ça.

Re: Comment réduire le nombre de couleurs d'une image

Publié : lun. 19/juin/2017 14:40
par Shadow
Totalement incroyable ce format, je suis sur le Q 8O
C'est le format du siècle !!!

Par contre comprends rien à l’anglais mais je voudrait vraiment savoir comment il on réussi un tel prodige :o
Merci !

Re: Comment réduire le nombre de couleurs d'une image

Publié : lun. 19/juin/2017 14:58
par Shadow
Se serais bien de faire une interface pour l'utiliser car comme t-elle on peut pas l'utiliser à son pleins potentiel
sauf en ligne de commande mais je sais pas faire et c'est galère, une interface avec toute les option serais géniale.
Si je savais le faire...

Re: Comment réduire le nombre de couleurs d'une image

Publié : mer. 21/juin/2017 2:43
par Shadow
PBG, comment ça marche, est ce que vous avez ou je peut trouver des info sur ça, c'est un format libre, il explose royalement JPG -> LOL
Alors comment ça marche ?