Image Optimizer

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message 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 ?
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
Bill Gates
Messages : 14
Inscription : lun. 19/juil./2010 19:17

Re: Image Optimizer

Message 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
Dernière modification par Bill Gates le sam. 05/mars/2016 21:53, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message par Ar-S »

Merci de donner ton opinion sans moquerie Bill Gates
~~~~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 »

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 ?!
Dernière modification par Shadow le sam. 05/mars/2016 22:45, modifié 5 fois.
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 »

Publie ton code pb (tu n'as pas le choix) 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 »

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.
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 »

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 !
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image Optimizer

Message 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"
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message 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"
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image Optimizer

Message 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:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Image Optimizer

Message 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()
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 »

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 !
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image Optimizer

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image Optimizer

Message 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 ;)
~~~~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 »

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 !
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