Page 3 sur 6

Re: Image Optimizer

Publié : sam. 05/mars/2016 20:22
par Shadow
Blablabla...

Code : Tout sélectionner

No petit bouricow...
Toi même mon cher !
un unsigned char ( 0 to 255 ) prendra toujours 1 octets en memory
Ont s'en tape de la mémoire, c'est dans fichier que sont les valeur, pas en mémoire !
your "optimisation" viens du compresseur jpeg : https://fr.wikipedia.org/wiki/JPEG#La_compression_JPEG , il y a plus de same colors
le jpeg pack les colors en bloc , paweil avec le png. ton progwamme a la rigeur , met les images plus darkness, c'est tout.
Rien compris mais bref.

Si tu enregistre ton image en PNG en faisant ma méthode, tu prends moins de place !
C'est le principale ok ?

Re: Image Optimizer

Publié : sam. 05/mars/2016 20:49
par Bill Gates
Ont s'en tape de la mémoire, c'est dans fichier que sont les valeur, pas en mémoire !
Tu refait ton petit bouricow, il n'existe pas en computer science des half-byte , qu'il soit dans un fichier, ou dans la mémoire ram / gpu , ne change rien mon petit bouricow.
Si il suffisait de divide par 2 pour la compression , tu ne crois pas que des ingénieurs l'aurais déjà utilisé , utilise ta méthode un fichier texte pour comprendre ton problème et que dans ton cas, tu n'optimises absolument rien. tu rend l'images juste plus sombre avec deux fois moins de nuance, ce qui facilite au passage la quantité de compression des vrais compresseur jpeg png , etc...

je vais t'appeler perceval, c'est les valeurs qui compte...
http://monq.biz/article-2461-Kaamelott++Le+sirop.monQ :D :D

Re: Image Optimizer

Publié : sam. 05/mars/2016 21:36
par Ar-S
Merci de donner ton opinion sans moquerie Bill Gates

Re: Image Optimizer

Publié : sam. 05/mars/2016 22:38
par Shadow
J'ai parfaitement compris !!!
Je le sais tous ça :)

C'est vous qui me comprenez pas je crois bien !
Alors ont va vous apprendre...


255 en BITS = 11111111 = 8 x 1, OK ? = 1 octets OK ?
240 en BITS = 11110000 = 4 x 1 et 4 x 0, OK ? = 1 octets OK ?
225 en BITS = 11100001= 3 x 1 et 4 x 0 et 1, OK ? = 1 octets OK ?
127 en BITS = 01111111 = 1 x 0 et 7 x 1 OK ? = 1 octets OK ?
63 en BITS = 00111111 = 12 x 0 et 6 x 1 OK ? = 1 octets OK ?
0 en BITS = 00000000 = 8 x 0 OK ? = 1 octets OK ?

Si je DIVISE TOUTES LES VALEUR PAR 2 et que je sais que ça n'ira jamais au dessus de par exemple 127 OK ?
Alors pourquoi se faire chier à écrire 01111111, quand 1111111 suffirais ?
SI TOUTES MES VALEUR EN BITS FONT TOUJOURS 7 BITS, pas de problème !

Donc si j'ai par exemple:

R220, V147, B255, A0
Normalement ça se code sur 4 octets, 4 caractères Ascii, 4 x 8 Bits, ok ?

En Bits = 11011100, 10010011, 11111111, 00000000

Et bien moi je dis que je veux que ça face moin, donc je divise tous par 2 tous le temps:
R220, V147, B255, A0 deviens donc maintenant: R110, V73, B127, A0

Et je les code sur 7 Bits et plus 8 !

En Bits = 1101010, 1001001, 1111111, 0000000

Maintenant un peut de pratique Messieurs !
Quel est le plus court ici:

1- 11011100100100111111111100000000
2- 1101010100100111111110000000

C'est le 2, ont gagne 3 Bits par couleur 24 Bits
et 4 Bits par couleur 32 Bits !

Multiplier ça maintenant par 1 000 000 et vous aurez un gain env de:

3 000 000 de Bits si c'est une image 24 Bits !
Soit à peut près 375000 octets = 366 Ko.

4 000 000 de Bits si c'est une image 32 Bits !
Soit à peut près 500000 octets = 488 Ko.

Ont continue car vous me suivez pas encore je suis sûr !

Si je code maintenant chaque groupe de 8 Bits sur un octets ça donne quoi ?
Version normale (24 Bits) = 8 x 3 = 24, 24 x 1 000 000 = 24 000 000, 24 000 000 / 8 = 3000000 Octets, 3000000 / 1024 = 2930 Ko, 2930 / 1024 = 2,86 Mo.
Ici il va me falloir donc un totale de 3 000 000 caractères Ascii pour l'ensemble de l'image, OK ?

Ici, pareil, je code chaque groupe de 8 Bits sur un octets ça donne quoi ?
Version 1 divisé par 2, (24 Bits) = 7 x 3 = 21, 21 x 1 000 000 = 21 000 000, 21 000 000 / 8 = 2625000 Octets, 2625000 / 1024 = 2564 Ko, 2564 / 1024 = 2,50 Mo.
Ici il va me falloir donc un totale de 2 625 000 caractères Ascii OK ?

Il restera très surement quelque Bits à la fin, inférieur à 8, il ne suffira alors que de rajouter des 0 avant pour faire un totale de 8.
Avez-vous compris maintenant ?!

Re: Image Optimizer

Publié : sam. 05/mars/2016 22:43
par SPH
Publie ton code pb (tu n'as pas le choix) 8)

Re: Image Optimizer

Publié : sam. 05/mars/2016 22:47
par Shadow
Ont à toujours le choix SPH :wink:

J'ai pas besoin de publier le code puisque vous avez la manip !
Pour cette solution du moins, mais si tu insiste encore, je posterais un exemple.

Re: Image Optimizer

Publié : dim. 06/mars/2016 0:30
par Shadow
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 !

Re: Image Optimizer

Publié : dim. 06/mars/2016 0:47
par falsam
Petit test en tenant compte du raisonnement de Shadow

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"

Re: Image Optimizer

Publié : dim. 06/mars/2016 1:10
par Shadow
Ainsi c'est juste:

Code : Tout sélectionner

;Ecriture de la valeur 255 en binaire 11111111
If CreateFile(0, "Test1.txt")
  I = 255
  WriteString(0, Bin(I))
  CloseFile(0)
EndIf

;Ecriture de la valeur 255/2 127 en binaire 1111111
If CreateFile(0, "Test2.txt")
  I = 127
  WriteString(0, Bin(I))
  CloseFile(0)
EndIf

Debug "test1.txt : " + FileSize("test1.txt") + " bytes"
Debug "test2.txt : " + FileSize("test2.txt") + " bytes"

Re: Image Optimizer

Publié : dim. 06/mars/2016 1:17
par falsam
Spock a écrit :bon , dans ces conditions, ça peut peut etre fonctionner
a voir
Pour le moment je suis dans la position du candide :wink:

Re: Image Optimizer

Publié : dim. 06/mars/2016 1:18
par Shadow
Tien teste ça et dis moi si c'est pas mieux que d'avoir 8 Bytes par couleur, ici que 7:

Code : Tout sélectionner

Enumeration 1
  #Image
EndEnumeration

Global FichierImage$ = ""

; Procedure de chargement d'une image
Procedure.l ChargementImage(NumeroImage, FiltreDefaut)
  
  Chargement_Image:
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpeg)|*.Jpeg"
  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$)), ".jpeg", 1)
      UseJPEGImageDecoder()
      
    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

; Arrondis un nombre suivent un Pas
Procedure RoundStep(Nombre.i, Pas.i)
  Protected Retour.i
  
  Retour = (Nombre / Pas) * Pas
  If Nombre % Pas > Pas / 2
    Retour + Pas
  EndIf
  
  ProcedureReturn Retour
EndProcedure

; Opp�ration sur le pixel lue actuellement
Procedure OpperationPixel(X, Y, Largeur, Hauteur, Profondeur, Couleur)
  
EndProcedure

; Procedure pour lire l'image
Procedure LireImage()
  
  If ChargementImage(#Image, 1)
    
    X = 0
    Y = 0
    
    LargeurImage = ImageWidth(#Image)
    HauteurImage = ImageHeight(#Image)
    ProfondeurImage = ImageDepth(#Image)
    
    OpenFile(0, GetFilePart(FichierImage$, #PB_FileSystem_NoExtension) + ".txt")
    
    StartDrawing(ImageOutput(#Image))
    
    If ProfondeurImage = 32
      DrawingMode(#PB_2DDrawing_AlphaBlend)
    EndIf
    
    For Y = 0 To HauteurImage - 1
      
      For X = 0 To LargeurImage - 1
        
        Couleur = Point(X, Y)
        
        Rouge = RoundStep(Red(Couleur), 2) / 2
        Vert = RoundStep(Green(Couleur), 2) / 2
        Bleu = RoundStep(Blue(Couleur), 2) / 2
        
        WriteString(0, RSet(Bin(Rouge), 7, "0"))
        WriteString(0, RSet(Bin(Vert), 7, "0"))
        WriteString(0, RSet(Bin(Bleu), 7, "0"))
        
        If ProfondeurImage = 32
          Alpha = RoundStep(Alpha(Couleur), 2) / 2
          WriteString(0, RSet(Bin(Bleu), 7, "0"))
        EndIf
        
      Next
      
    Next
    
    StopDrawing()
    
  EndIf
  
EndProcedure

LireImage()

Re: Image Optimizer

Publié : dim. 06/mars/2016 1:21
par Shadow
Tu peut ensuite convertir ton fichier binaire en octets comme suis:

Code : Tout sélectionner

Procedure BinVal(a$); - Convert a String in binary-format in numeric value 
  a$=Trim(UCase(a$)) 
  If Asc(a$)='%' 
    a$=Trim(Mid(a$,2,Len(a$)-1)) 
  EndIf 
  Result=0 
  *adr.Byte=@a$ 
  For i=1 To Len(a$) 
    Result<<1 
    Select *adr\b 
      Case '0' 
      Case '1':Result+1 
      Default:i=Len(a$) 
    EndSelect 
    *adr+1 
  Next 
  ProcedureReturn Result 
EndProcedure

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

If SelectionFichier$
  
  If ReadFile(0, SelectionFichier$) 
    
    LongeurFichier.q = Lof(0)
    
    If CreateFile(1, NomFichier$ + " Octets.txt")
      
      While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
        
        Binaire$ = ReadString(0, #PB_Ascii, 8)
        Octets = BinVal(Binaire$)
        
        WriteAsciiCharacter(1, Octets)
        
      Wend
      
      CloseFile(0)
      CloseFile(1)
      
    Else
      MessageRequester("Erreur création fichier...", "    Impossible de créer le fichier Octets !", 48)
      End
      
    EndIf
    
  Else
    
    MessageRequester("Erreur d'ouvertur de fichier...", "    Le fichier ne peut pas être ouvert !", 48)
    End
    
  EndIf
  
EndIf
Tu remarquera que si tu compresse ton fichier binaire avec 7zip au maxi
et le fichier octets, que la version binaire se compresse encore bien mieux !

Cependant il y a un schmilblick la dedans vois tu car en vrais
j'optient encore mieux que ça !

Re: Image Optimizer

Publié : dim. 06/mars/2016 1:28
par falsam
Tu ne me convainc pas.

Je sélectionne un jpg de 127 Ko et j'obtiens un binaire au format txt de 21 Mo.

Corrige

Code : Tout sélectionner

Image Jpeg (*.Jpeg)|*.Jpeg
par

Code : Tout sélectionner

Image Jpg (*.Jpg)|*.Jpg

Re: Image Optimizer

Publié : dim. 06/mars/2016 11:04
par Ar-S
Pour vos vos tests, utilisez au moins du PNG et pas un format destructeur.. Sinon personne ne démontrera quoique ce soit ;)

Re: Image Optimizer

Publié : dim. 06/mars/2016 11:54
par Shadow
Ce format est destructeur justement !
Tu pers toujours plus ou moins 1 par composante.

Mais tellement petit que ont ne vois VRAIMENT rien !
Et je vais vous prouver mes dires !