Image Optimizer

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message par Ar-S »

C'est moi qui vais te prouver les dires...

J'ai fait 1 image PNG 24 bits sans perte.

Image
22,8ko

Après ma compression magique, voilà la suivante..

Image
22,3ko

Tu t'apercevras que la seconde est plus légère que la 1ère alors que même en zoomant, il y a 0 perte.

Pourquoi ?

Parce que dans ma 1ere la couleur du fond est en RGB(00,01,01) et que pour la seconde, je suis passé en RGB (00,00,00)

Donc tu as surement appris des trucs en codant tout ça mais ne mélange pas tout avec ton histoire de fichier binaire.
C'est comme si tu stockais les pixel dans un txt et que tu le compressais, forcement un fichier txt sera plus léger. Encore plus si tu divises les valeurs des couleurs par 2. (et que tu les remultiplies par 2 pour le décodage)

Mais l'unique chose qui fait gagner qques ko à ton image, c'est qu'il y a plus de noir dedans.

CQFD

Sur ce je vous laisse, je vais au dernier repas/marché aux truffes de ma région ! :mrgreen:
~~~~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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Image Optimizer

Message par Anonyme2 »

Ar-S a raison, le format PNG est un format compressé sans destruction qui comporte plusieurs chunk en fonction du type d'image.

Comme disent les anglais c'est 'lossless data compression'.
Cherche un peu sur le format PNG, tu verras que c'est ce que te dis Ar-S.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Image Optimizer

Message par Anonyme2 »

Spock a écrit :Deja il faudrait partir d'une image BMP !
pas de compression


puis a parti de cette image, tenter d'appliquer des algos ... là on pourra partir sur quelque chose de solide ! :)
Bonne idée,

on compresse et décompresse 100 fois (plus ou moins) et on compare.
Avatar de l’utilisateur
Bill Gates
Messages : 14
Inscription : lun. 19/juil./2010 19:17

Re: Image Optimizer

Message par Bill Gates »

Shadow a écrit :Dans un fichier que je te dis que diable !

Bon puisque vous comprenez rien je vais le faire ste foutue code.
Vous verrez que se que je dis est vraie non de diou !

Ca ne change rien , fichier, ram , sd card, un octet , reste un octet.

Falsam a écrit :]Petit test en tenant compte du raisonnement de Shadow
Code:

Code : Tout sélectionner

Define Byte.b = 1

;Ecriture de la valeur 255 en binaire 1111111
If CreateFile(0, "Test1.txt")
  For i = 1 To 7
    WriteByte(0, Byte) 
  Next
  CloseFile(0)
EndIf

;Ecriture de la valeur 255/2 127 en binaire 111111
If CreateFile(0, "Test2.txt")
  For i = 1 To 6
    WriteByte(0, Byte) 
  Next
  CloseFile(0)
EndIf

Debug "test1.txt : " + FileSize("test1.txt") + " bytes"
Debug "test2.txt : " + FileSize("test2.txt") + " bytes"
Tu writes des bytes ou des serie de 8 bits, pour un file tu ecrit 7*8 bits, et pour l'autre 6*8 bits.

Code : Tout sélectionner

MyData$       = "Shadow is useless"
Compressed$   = "" 
unCompressed$ = "" 

For i = 0 To Len(MyData$) - 1
  unsigned_char.a =  Asc( Mid(MyData$,i+1,1) )
  half.a          = unsigned_char / 2 ; shadow algo
  Compressed$ + Chr(half)
Next



For i = 0 To Len(Compressed$) - 1
  unsigned_char.a =  Asc( Mid(Compressed$,i+1,1) )
  half.a          = unsigned_char / 2 ; shadow algo
  unCompressed$ + Chr(half)
Next

Debug Compressed$
Debug unCompressed$

If unCompressed$ <> MyData$
   MessageRequester("code","is useless")
EndIf 

Moins il y a de couleur , plus les algo jpeg / png sont efficace. tu rends juste ton image plus sombre et plus efficace a la compression des vrai compresseurs. par sur une image brute ( rgba ) et adapte un vrai compresseur : https://fr.wikipedia.org/wiki/Codage_de_Huffman
tu fait perdre du temps a tout le people.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

Ar-S, tu as parfaitement raison quoi que...
En faite tu as raison et je suis bien d'accord avec toi.
C'est comme si tu stockais les pixel dans un txt et que tu le compressais, forcement un fichier txt sera plus léger. Encore plus si tu divises les valeurs des couleurs par 2. (et que tu les remultiplies par 2 pour le décodage)
C'est exactement se que je fais :)
Tu as tous compris !
Mais se qui fais aussi prendre moins de place à l'image et au fichier texte, c'est si tu met toutes les valeurs en Pair !
Mais l'unique chose qui fait gagner qques ko à ton image, c'est qu'il y a plus de noir dedans.
Bien, bien, je suis aussi d'acord avec toi ici et je vais te faire voir un de mes code qui fonctionne très bien.
Je remplace toutes les couleurs RGB(0, 0, 0) par RGB(1, 1, 1) ou RGBA(0, 0, 0, 0) par du RGBA(1, 1, 1, 1)
Ensuite je regarde la couleur du pixel, je la compare à la couleur sauvegardé (Au début ya rien c'est normale)
Si la couleur actuellement lut n'as pas été enregistré (N'est pas connue), je l'enregistre dans une variable.
Si la couleur actuellement lut a été enregistré (Connue), je remplace le pixel lut par RGB(0, 0, 0) ou RGBA(0, 0, 0, 0).
De cette façon, seul le premier pixel de couleur est, le reste qui suis est noir pour dire que le pixel se répète tans que ya du RGB(0, 0, 0) ou RGBA(0, 0, 0, 0).
De cette façon, ont gagne en place !

Ce code fais cela, il te créer aussi l'image de sortie en PNG pour que tu puisse voir à quoi ça ressemble.
Il te créer un fichier TXT ou sont toutes les couleurs de l'image modifiés.

Code : Tout sélectionner

; Code créer par monsieur Dieppedalle David le 02/03/2016.

; Ce code remplace tous les pixels noir (0) de l'image, par du noir (1) puis remplace tous les pixels
; voisin de la même Couleur.q par du noir (0) (Sauf le premier), jusqu'à se qu'une autre Couleur.q soit trouvé.

; Ex: RGB(125, 147, 25), RGB(125, 147, 25), RGB(125, 147, 25) deviendra: RGB(125, 147, 25), RGB(0, 0, 0), RGB(0, 0, 0).
; Ex: RGB(59, 198, 65, 255), RGB(59, 198, 65, 255), RGB(59, 198, 65, 255) deviendra: RGB(59, 198, 65, 255), RGB(0, 0, 0, 0), RGB(0, 0, 0, 0).

Global NomFichierImage$

; Procedure de chargement d'une image
Procedure.l ChargementImage(NumeroImage.i, FiltreDefaut.i)
  
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpg)|*.Jpg|Image Tga (*.Tga)|*.Tga|Image Tiff (*.Tiff)|*.Tiff"
  FichierImage$ = OpenFileRequester("Choisissez un fichier image à charger...", GetHomeDirectory() + "Bureau\", Filtre$, FiltreDefaut.i)
  NomFichierImage$ = GetFilePart(FichierImage$, #PB_FileSystem_NoExtension)
  
  If FichierImage$
    
    Select LCase(GetExtensionPart(FichierImage$))
        
      Case  "bmp"
        ; Ok
        
      Case "png"
        UsePNGImageDecoder()
        
      Case "jpeg","jpg"
        UseJPEGImageDecoder()
        
      Case  "tga"
        UseTGAImageDecoder()
        
      Case "tiff"
        UseTIFFImageDecoder()
        
      Default
        MessageRequester("Fichier invalide !", "      Veuillez choisir un fichier d'image valide !", 48)
        
        ProcedureReturn 0
        
    EndSelect
    
    If LoadImage(NumeroImage.i, FichierImage$) <> 0
      ProcedureReturn LoadImage(NumeroImage.i, 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

#ImageSource = 1
#ImageCible = 2

NumeroImageSource.i = ChargementImage(#ImageSource, 1)
OpenFile(0, NomFichierImage$ + "Sortie V1.txt")

If NumeroImageSource.i 
  
  If IsImage(#ImageSource)
    
    LargeurImage.i = ImageWidth(#ImageSource)
    HauteurImage.i = ImageHeight(#ImageSource)
    ProfondeurImage.i = ImageDepth(#ImageSource)
    
    If ProfondeurImage.i < 32
      NumeroImageCible = CreateImage(#ImageCible, LargeurImage.i, HauteurImage.i, ProfondeurImage.i)
      
    ElseIf ProfondeurImage.i = 32
      NumeroImageCible = CreateImage(#ImageCible, LargeurImage.i, HauteurImage.i, ProfondeurImage.i, #PB_Image_Transparent)
      
    EndIf
    
    If Not NumeroImageCible And Not IsImage(#ImageCible)
      MessageRequester("Erreur", "Image Cible non initialisé !", 64)
      End
    EndIf
    
    If ProfondeurImage.i < 32
      Dim TableauValeurImage.i(((LargeurImage.i) * (HauteurImage.i) * 3) - 1) ; -1 Car le tableau commence à 0
    ElseIf ProfondeurImage.i = 32
      Dim TableauValeurImage.i(((LargeurImage.i) * (HauteurImage.i) * 4) - 1) ; -1 Car le tableau commence à 0
    EndIf
    
    WriteUnicodeCharacter(0, LargeurImage.i)
    WriteUnicodeCharacter(0, HauteurImage.i)
    WriteAsciiCharacter(0, ProfondeurImage.i)
    
    IndexTableau.q = 0
    
    StartDrawing(ImageOutput(#ImageSource))
    
    If ProfondeurImage.i < 32
      
      For Y.i = 0 To HauteurImage.i - 1
        
        For X.i = 0 To LargeurImage.i - 1
          
          Couleur.q = Point(X.i, Y.i)
          
          Rouge.i = Red(Couleur.q)
          Vert.i = Green(Couleur.q)
          Bleu.i = Blue(Couleur.q)
          
          If Rouge.i = 0
            Rouge.i = 1
          EndIf
          
          If Vert.i = 0
            Vert.i = 1
          EndIf
          
          If Bleu.i = 0
            Bleu.i = 1
          EndIf
          
          If SauvegardeCouleur.q = Couleur.q
            Rouge.i = 0
            Vert.i = 0
            Bleu.i = 0
            
          ElseIf SauvegardeCouleur.q <> Couleur.q
            SauvegardeCouleur.q = Couleur.q
            
          EndIf
          
          WriteAsciiCharacter(0, Rouge.i)
          WriteAsciiCharacter(0, Vert.i)
          WriteAsciiCharacter(0, Bleu.i)
          
          TableauValeurImage.i(IndexTableau.q) = Rouge.i
          IndexTableau.q + 1
          
          TableauValeurImage.i(IndexTableau.q) = Vert.i
          IndexTableau.q + 1
          
          TableauValeurImage.i(IndexTableau.q) = Bleu.i
          IndexTableau.q + 1
          
        Next
        
      Next
      
    ElseIf ProfondeurImage.i = 32
      
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      
      IndexTableau.q = 0
      
      For Y.i = 0 To HauteurImage.i - 1
        
        For X.i = 0 To LargeurImage.i - 1
          
          Couleur.q = Point(X.i, Y.i)
          
          Rouge.i = Red(Couleur.q)
          Vert.i = Green(Couleur.q)
          Bleu.i = Blue(Couleur.q)
          Alpha.i = Alpha(Couleur.q)
          
          If Rouge.i = 0
            Rouge.i = 1
          EndIf
          
          If Vert.i = 0
            Vert.i = 1
          EndIf
          
          If Bleu.i = 0
            Bleu.i = 1
          EndIf
          
          If Alpha.i = 0
            Alpha.i = 1
          EndIf
          
          If SauvegardeCouleur.q = Couleur.q
            Rouge.i = 0
            Vert.i = 0
            Bleu.i = 0
            Alpha.i = 0
            
          Else
            SauvegardeCouleur.q = Couleur.q
            
          EndIf
          
          WriteAsciiCharacter(0, Rouge.i)
          WriteAsciiCharacter(0, Vert.i)
          WriteAsciiCharacter(0, Bleu.i)
          WriteAsciiCharacter(0, Alpha.i)
          
          TableauValeurImage.i(IndexTableau.q) = Rouge.i
          IndexTableau.q + 1
          
          TableauValeurImage.i(IndexTableau.q) = Vert.i
          IndexTableau.q + 1
          
          TableauValeurImage.i(IndexTableau.q) = Bleu.i
          IndexTableau.q + 1
          
          TableauValeurImage.i(IndexTableau.q) = Alpha.i
          IndexTableau.q + 1
          
        Next
        
      Next
      
    EndIf
    
    StopDrawing()
    
    StartDrawing(ImageOutput(#ImageCible))
    
    If ProfondeurImage.i < 32
      
      X.i = 0
      Y.i = 0
      
      For IndexTableau.q = 0 To (((LargeurImage.i) * (HauteurImage.i)) * 3) - 1
        
        Plot(X.i, Y.i, RGB(TableauValeurImage(IndexTableau.q), TableauValeurImage(IndexTableau.q + 1), TableauValeurImage(IndexTableau.q + 2)))
        IndexTableau.q + 2
        
        If X.i < LargeurImage.i - 1
          X.i + 1
          
        ElseIf X.i = LargeurImage.i - 1
          X.i = 0
          Y.i + 1
          
        EndIf
        
      Next
      
    ElseIf ProfondeurImage.i = 32
      
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      
      X.i = 0
      Y.i = 0
      
      For IndexTableau.q = 0 To (((LargeurImage.i) * (HauteurImage.i)) * 4) - 1
        
        Plot(X.i, Y.i, RGBA(TableauValeurImage(IndexTableau.q), TableauValeurImage(IndexTableau.q + 1), TableauValeurImage(IndexTableau.q + 2), TableauValeurImage(IndexTableau.q + 3)))
        IndexTableau.q + 3
        
        If X.i < LargeurImage.i - 1
          X.i + 1
          
        ElseIf X.i = LargeurImage.i - 1
          X.i = 0
          Y.i + 1
          
        EndIf
        
      Next
      
    EndIf
    
    StopDrawing()
    
    If IsImage(#ImageCible)
      
      UsePNGImageEncoder()
      SaveImage(#ImageCible, NomFichierImage$ + " Sortie V1.png", #PB_ImagePlugin_PNG, -1, ProfondeurImage.i)
      
    EndIf
    
  Else
    MessageRequester("Erreur", "Image Source non initialisé !", 64)
    
  EndIf
  
Else
  
EndIf

CloseFile(0)
Maintenant voici pour le décodage du fichier Texte:

Code : Tout sélectionner

; Code créer par monsieur Dieppedalle David le 02/03/2016.

; Ce code remplace tous les pixels noir (0) de l'image, par la couleur du premier pixel de couleur.

; Ex: RGB(125, 147, 25), RGB(0, 0, 0), RGB(0, 0, 0) deviendra: RGB(125, 147, 25), RGB(125, 147, 25), RGB(125, 147, 25).
; Ex: RGB(59, 198, 65, 255), RGB(0, 0, 0, 0), RGB(0, 0, 0, 0) deviendra: RGB(59, 198, 65, 255), RGB(59, 198, 65, 255), RGB(59, 198, 65, 255).

; Ensuite une fois ça fait, remplace toutes les valeur (1) par (0).
; Ex: RGB(125, 1, 25), deviendra: RGB(125, 0, 25).
; Ex: RGB(1, 198, 1, 255), deviendra: RGB(0, 198, 0, 255).

SelectionFichier$ = OpenFileRequester("Choisissez le fichier texte de l'image à charger...", GetHomeDirectory() + "\Bureau\", "Fichier (*.txt)|*.txt", 0)
NomFichier$ = GetFilePart(SelectionFichier$, #PB_FileSystem_NoExtension)

If SelectionFichier$
  
  If ReadFile(0, SelectionFichier$) 
    
    LongeurFichier.q = Lof(0)
    
    ; Extraction de la Largeur de l'image
    LargeurImage.i = ReadUnicodeCharacter(0)
    
    ; Extraction de la Hauteur de l'image
    HauteurImage.i = ReadUnicodeCharacter(0)
    
    ; Extraction de la Profondeur de l'image
    ProfondeurImage.i = ReadAsciiCharacter(0)
    
    If ProfondeurImage.i < 32
      
      If CreateImage(1, LargeurImage.i, HauteurImage.i, ProfondeurImage.i)
        StartDrawing(ImageOutput(1))
        
        X.i = 0
        Y.i = 0
        
        While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
          
          ; Lecture de des valeurs RGB dans le fichier texte
          Rouge.i = ReadAsciiCharacter(0)
          Vert.i = ReadAsciiCharacter(0)
          Bleu.i = ReadAsciiCharacter(0)
          
          If (Rouge.i > 0 Or Vert.i > 0 Or Bleu.i > 0) ; Si la Couleur n'est pas égale à 0, ont sauvegarde la Couleur.q
            SauvegardeCouleur.q = RGB(Rouge.i, Vert.i, Bleu.i)
            
          ElseIf (Rouge.i = 0 And Vert.i = 0 And Bleu.i = 0) ; Sinon Si la Couleur est égale à 0, c'est qu'il faut remplacer la Couleur (0) par celle sauvegardé précédément
            
            Rouge.i = Red(SauvegardeCouleur.q)
            Vert.i = Green(SauvegardeCouleur.q)
            Bleu.i = Blue(SauvegardeCouleur.q)
            
          EndIf
          
          ; Ici ont va pour que ça prenne moins de place remplacer toutes les valeur 1 par 0.
          If Rouge.i = 1
            Rouge.i= 0
          EndIf
          
          If Vert.i = 1
            Vert.i= 0
          EndIf
          
          If Bleu.i = 1
            Bleu.i= 0
          EndIf
          
          Plot(X.i, Y.i, RGB(Rouge.i, Vert.i, Bleu.i))
          
          If X.i < LargeurImage.i - 1
            X.i + 1
          Else
            X.i = 0
            Y.i + 1
          EndIf
          
        Wend
        
        StopDrawing()
        
        UsePNGImageEncoder()
        SaveImage(1, NomFichier$ + " Reconstitué.png", #PB_ImagePlugin_PNG, -1, ProfondeurImage.i)
        
      Else
        MessageRequester("Erreur création image...", "    Impossible de créer le fichier image !", 48)
        End
      EndIf
      
    ElseIf ProfondeurImage.i = 32
      
      If CreateImage(1, LargeurImage.i, HauteurImage.i, ProfondeurImage.i, #PB_Image_Transparent)
        StartDrawing(ImageOutput(1))
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        
        X.i = 0
        Y.i = 0
        
        While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
          
          ; Lecture de des valeurs RGB dans le fichier texte
          Rouge.i = ReadAsciiCharacter(0)
          Vert.i = ReadAsciiCharacter(0)
          Bleu.i = ReadAsciiCharacter(0)
          Alpha.i = ReadAsciiCharacter(0)
          
          If (Rouge.i > 0 Or Vert.i > 0 Or Bleu.i > 0 Or Alpha.i > 0) ; Si la Couleur n'est pas égale à 0, ont sauvegarde la Couleur.q
            SauvegardeCouleur.q = RGBA(Rouge.i, Vert.i, Bleu.i, Alpha.i)
            
          ElseIf (Rouge.i = 0 And Vert.i = 0 And Bleu.i = 0 And Alpha.i = 0) ; Sinon Si la Couleur est égale à 0, c'est qu'il faut remplacer la Couleur (0) par celle sauvegardé précédément
            
            Rouge.i = Red(SauvegardeCouleur.q)
            Vert.i = Green(SauvegardeCouleur.q)
            Bleu.i = Blue(SauvegardeCouleur.q)
            Alpha.i = Alpha(SauvegardeCouleur.q)
            
          EndIf
          
          ; Ici ont va pour que ça prenne moins de place remplacer toutes les valeur 1 par 0.
          If Rouge.i = 1
            Rouge.i= 0
          EndIf
          
          If Vert.i = 1
            Vert.i= 0
          EndIf
          
          If Bleu.i = 1
            Bleu.i= 0
          EndIf
          
          If Alpha.i = 1
            Alpha.i= 0
          EndIf
          
          Plot(X.i, Y.i, RGBA(Rouge.i, Vert.i, Bleu.i, Alpha.i))
          
          If X.i < LargeurImage.i - 1
            X.i + 1
          Else
            X.i = 0
            Y.i + 1
          EndIf
          
        Wend
        
        StopDrawing()
        
        UsePNGImageEncoder()
        SaveImage(1, NomFichier$ + " Reconstitué.png", #PB_ImagePlugin_PNG, -1, ProfondeurImage.i)
        
      Else
        MessageRequester("Erreur création image...", "    Impossible de créer le fichier image !", 48)
        End
      EndIf
      
    EndIf
    
    CloseFile(0)               ; Ferme le fichier précédemment ouvert
    
  Else
    MessageRequester("Erreur d'ouvertur de fichier...", "    Le fichier ne peut pas être ouvert !", 48)
    End
    
  EndIf
  
EndIf
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

Bill Gates:
tu fait perdre du temps a tout le people.
Et bien ont ne te retient pas monsieur Bill Gates.

Au passage, prendre le nom d'un type connue comme lui ne fais pas de toi un As !
C'est de l'usurpation d'identité !

Et si t'es vraiment Bill Gates, arrête de te foutre de moi et rappel
toi t'es séance dans ton garage à faire t'es expérience !

Ont a tous débuté un jour aussi con qu'un tous petit tronc d'arbre
et petit à petit ont est devenu Grand chêne, enfin pour certain du moins.

Note: Je pense pas que Bill Gates perde son temps à venir sur un petit forum comme ça
ou alors c'est qu'il n'as vraiment rien à foutre de ses journée :mrgreen:
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message par Ar-S »

Ar-S, tu as parfaitement raison q̶u̶o̶i̶ ̶q̶u̶e̶.̶.̶.̶
̶E̶n̶ ̶f̶a̶i̶t̶e̶ ̶t̶u̶ ̶a̶s̶ ̶r̶a̶i̶s̶o̶n̶ ̶e̶t̶ ̶j̶e̶ ̶s̶u̶i̶s̶ ̶b̶i̶e̶n̶ ̶d̶'̶a̶c̶c̶o̶r̶d̶ ̶a̶v̶e̶c̶ ̶t̶o̶i̶.̶
le début suffit. 8)

Bon déjà je salue tes efforts pour le code. C'est une 1ère chose (et c'est important).

Donc comme je l'ai dit, tu ne réduis PAS la taille d'une image, tu modifies ses couleurs. Ce n'est pas visible à l'oeil nu mais ce n'est pas pour ça que c'est une compression d'image.
En revanche, ton histoire de fichier texte c'est du grand bordel.
J'ai fait le test de convertir mon image PNG en TXT ou j'ai stocké les RGBA ligne après ligne en HEX. Ensuite je l'ai compressé avec 7zip.. Et bien mon resultat est plus léger que ce que ton soft génère une fois compressé...

Résultat des tests via l'image d'exemple ci dessus (la seconde) :

Mon image : 23ko
Mon txt hex 7zippé : 22ko VS Ton fichier 7zippé : 26ko
Ton image reconstitué : 43ko !!

Forcément si tu changes les RGBA(0,0,0,0) en RGBA(01,01,01,01) ce sera plus gros en sortie.

Enfin, si je prends simplement mon image et que je la 7zip directement : 22ko

Bref, pour moi tu devrais SIMPLEMENT faire :

1 - Charger l'image à "optimiser"
2 - Convertir ton image en mémoire
3 - proposer de sauver l'image optimisée

Le reste n'a aucun intérêt, ce n'est qu'un fichier txt zippé !
~~~~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
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

Se serait bien de partagé ton code !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message par Ar-S »

Voilà le PLUS important :

Code : Tout sélectionner

UsePNGImageDecoder()

If Not LoadImage(0,"20.png",0)
  Debug "erreur, pas de fichier"
  End
EndIf

Procedure StockPixelTab(IMG)
  
DimX = ImageWidth(IMG)
DimY = ImageHeight(IMG)

Dim TabPixel(DimX, DimY)

  StartDrawing(ImageOutput(IMG))
  
For y = 0 To DimY-1
      For x = 0 To DimX-1
      
        TabPixel(x,y) = Point (x,y)
   
      Next x
Next y      

StopDrawing()

EndProcedure

; 
StockPixelTab(IMG)
MessageRequester("end","Stockage des couleurs des pixels terminé",0)

; Maintenant à toi de faire ce que tu veux avec ce tableau de pixel
;UsePNGImageEncoder()
le tableau TabPixel(x,y) contient toutes les couleurs de chaque pixel.
Donc à toi de les convertir à ta guise.
Tu peux ajouter dans la boucle for/next

Code : Tout sélectionner

Rouge = Red(TabPixel(x,y))
Vert = Green(TabPixel(x,y))
Bleu = Blue (TabPixel(x,y))
Alpha = Alpha (TabPixel(x,y))
et appliquer l'effet désiré..
Exemple tout bête

Code : Tout sélectionner

If Rouge < 3 : Rouge = 0 : endif
If Vert < 3 : Vert = 0 : endif
If Bleu < 3 : Bleu = 0 : endif
TabPixel(x,y) = RGBA(rouge,vert,bleu,Alpha)
~~~~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
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

Convertir une image en HEX:

Code : Tout sélectionner

; Code crée par Monsieur Dieppedalle David le 06/03/2016.

Global NomFichierImage$

; Procedure de chargement d'une image.
Procedure.l ChargementImage(NumeroImage.i, FiltreDefaut.i)
  
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpg)|*.Jpg|Image Tga (*.Tga)|*.Tga|Image Tiff (*.Tiff)|*.Tiff"
  FichierImage$ = OpenFileRequester("Choisissez un fichier image à charger...", GetHomeDirectory() + "Bureau\", Filtre$, FiltreDefaut.i)
  NomFichierImage$ = GetFilePart(FichierImage$, #PB_FileSystem_NoExtension)
  
  If FichierImage$
    
    Select LCase(GetExtensionPart(FichierImage$))
        
      Case  "bmp"
        ; Ok
        
      Case "png"
        UsePNGImageDecoder()
        
      Case "jpeg", "jpg"
        UseJPEGImageDecoder()
        
      Case  "tga"
        UseTGAImageDecoder()
        
      Case "tiff"
        UseTIFFImageDecoder()
        
      Default
        MessageRequester("Fichier invalide !", "      Veuillez choisir un fichier d'image valide !", 48)
        
        ProcedureReturn 0
        
    EndSelect
    
    If LoadImage(NumeroImage.i, FichierImage$) <> 0
      ProcedureReturn LoadImage(NumeroImage.i, 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

Procedure.q LectureImage(NumeroImage.i, LargeurImage.i, HauteurImage.i)
  
  Static X.i, Y.i ; Retient les valeurs de X.i et Y.i.
  
  ; Si l'image est initialisé.
  If IsImage(NumeroImage.i)
    
    ; Si la Largeur ainsi que la Hauteur de l'image sont supérieur à 0.
    If LargeurImage.i > 0 And HauteurImage.i > 0
      
      ; Lecture de l'image à partir du Haut Gauche jusqu'à Bas Droite (Lecture de l'image de Gauche à Droite et de Haut en Bas)
      
      ; Si tous les pixels ont été lus.
      If (X.i = LargeurImage.i) And (Y.i = HauteurImage.i - 1)
        ProcedureReturn -1 ; retourne -1 pour dire que l'image a été lus entièrement.
        
      ElseIf X.i = LargeurImage.i
        
        X = 0
        
        If Y.i < HauteurImage.i - 1
          Y.i + 1
        EndIf
        
      EndIf
      
      Couleur.q = Point(X.i, Y.i)
      X + 1
      
      ProcedureReturn Couleur.q
      
    Else ; Sinon, la Largeur et / ou la Hauteur de l'image sont inférieur ou égale à 0, retourne -1 pour dire que la lecture de l'image est terminé.
      ProcedureReturn -1
      
    EndIf
    
  Else ; Sinon, l'image n'est pas initialisé, retourne -1 pour dire que la lecture de l'image est terminé.
    ProcedureReturn -1
    
  EndIf
  
EndProcedure

#ImageSource = 1

; Choix de l'image à charger.
NumeroImageSource.i = ChargementImage(#ImageSource, 1)

; Si le chargement de l'image a réussi.
If NumeroImageSource.i 
  
  ; Si l'image est initialisé.
  If IsImage(#ImageSource)
    
    LargeurImage.i = ImageWidth(#ImageSource) ; Obtention de la Largeur de l'image chargé. 
    HauteurImage.i = ImageHeight(#ImageSource); Obtention de la Hauteur de l'image chargé. 
    ProfondeurImage.i = ImageDepth(#ImageSource) ; Obtention de la Profondeur de couleur (En Bits) de l'image chargé. 
    
    If CreateFile(1, NomFichierImage$ + " HEX.txt")
      
      WriteString(1, RSet(Hex(LargeurImage.i, #PB_Word), 4, "0"))
      WriteString(1, RSet(Hex(HauteurImage.i, #PB_Word), 4, "0"))
      WriteString(1, RSet(Hex(ProfondeurImage.i, #PB_Ascii), 2, "0"))
      
      StartDrawing(ImageOutput(#ImageSource))
      
      Repeat
        
        Couleur.q = LectureImage(#ImageSource, LargeurImage.i, HauteurImage.i) ; Retourne la couleur du prochain pixel de l'image actuelement lus.
        
        ; Toute l'image a été lus.
        If Couleur.q = -1
          Break ; Ont quitte la boucle car l'image a été entièrement lus.
        EndIf
        
        Rouge.i = Red(Couleur.q) ; Extraction de la composante Rouge de la Couleur.
        Vert.i = Green(Couleur.q); Extraction de la composante Vert de la Couleur.
        Bleu.i = Blue(Couleur.q) ; Extraction de la composante Bleu de la Couleur.
        
        WriteString(1, RSet(Hex(Rouge.i, #PB_Ascii), 2, "0"))
        WriteString(1, RSet(Hex(Vert.i, #PB_Ascii), 2, "0"))
        WriteString(1, RSet(Hex(Bleu.i, #PB_Ascii), 2, "0"))
        
        ; Uniquement si l'image est en 32 Bits.
        If ProfondeurImage = 32
          Alpha.i = Alpha(Couleur.q) ; Extraction de la composante Alpha de la Couleur.
          WriteString(1, RSet(Hex(Alpha.i, #PB_Ascii), 2, "0"))
        EndIf
        
        PixelsLus.i + 1
        
      ForEver
      
      StopDrawing()
      CloseFile(1)
      
    Else
      MessageRequester("Erreur création fichier !", "      Impossible de créer le fichier " + Chr(34) + NomFichierImage$ + ".txt" + Chr(34) + " !", 16)
      End
    EndIf
    
    Debug LargeurImage.i * HauteurImage.i
    Debug PixelsLus.i
    
  EndIf
  
EndIf
Et effectivement tu as raison Ar-S, en HEX c'est encore mieux une fois compresser avec 7-Zip !
Attention, je parle de l'image d'origine !
Car avec la version ou on remplace les pixel de même couleurs par du noir, ne fonctionne pas !
A suivre !

Merci !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message par Ar-S »

Pour ma part c'est terminé, il ni a plus rien à suivre ;)
~~~~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
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Image Optimizer

Message par SPH »

Ar-S a écrit :Pour ma part c'est terminé, il ni a plus rien à suivre ;)
Moi, je vais suivre l'affaire.
Je pense que vous avez tous raison mais shadow aussi. Sauf qu'il ne s'y prend pas de la bonne facon.

Resumons :

Prenons tout dabord un BMP.
Puis, divisons par 4 les composantes R, V et B
Supprimons le bit de poids faible.

Cela fait economiser 3/8eme du poids du BMP.
MAIS : il ne faut pas le sauver dans un TXT !! Il faut le stocker dans un fichier data (sans une extention connue)

Je coderais le truc dans quelques jours.

A suivre donc... 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

SPH, très bien mais il y aura aussi de la perte !
Regarde un ex:

255 / 4 = 63,75 -> donc ici 63 ok ?
63 * 4 = 252, tu pers 3 ici !

184 / 4 = 46
63 * 4 = 184, tu pers 0 ici !

Plus tu divise la valeur et plus tu va perdre !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Image Optimizer

Message par SPH »

Shadow a écrit :SPH, très bien mais il y aura aussi de la perte !
Regarde un ex:

255 / 4 = 63,75 -> donc ici 63 ok ?
63 * 4 = 252, tu pers 3 ici !
Perdre 3 me parait peu. Faudra voir en fait...

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message par Shadow »

SPH, oui, 3, 4 c'est pas énorme et tu ne vois pas trop la différence mais tous de même !
Le meilleurs niveau qualité et Taille c'est: divisé par 2.
On ne vois vraiment rien même en zoomant, même sur les images 32 Bits.
C'est se qui à de mieux niv rapport qualité et taille.

Diviser par 4 reste très correcte mais tu vois la différence
si tu cherche en zoomant mais c'est encore très bon.

Tu ne vois pas de différence sans zoom, la qualité reste pas mal du tout.
C'est un bon compromis niveau taille et qualité.

Si tu divise par 8 maintenant, ont restera dans le politiquement correcte.
La perte peut aller jusque 8 et ça devient visible à ce stade-ci !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre