Créer un icône au format windows XP avec des BMP

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Créer un icône au format windows XP avec des BMP

Message par Le Soldat Inconnu »

Salut,

un code bien pratique qui permet de créer des icône au format windows XP.
je n'ai pas encore fait le module vraie couleur. il y a le bouton mais il ne sert encore à rien.

bon avant de donner le code, une explication du principe s'impose :

ce code permet, à partir de 2 BMP de créer un icône au formats XP
il s'appuie sur 2 images d'un même objet. la première image avec le dessin sur fonc blanc, la deuxième avec le dessin sur fond noir.
le programme reconstituant la transparence et les effets de fondu du dessin (par exemple une ombre)
puis il enregistre l'icône au format XP

il faut que l'image fasse 16*16, 32*32, ou 48*48
le programme va ensuite créer un icône au format XP de la même taille
il ne reste plus qu'à assembler les différent formats d'icones dans un éditeur d'icône pour obtenir un icone complet ( ça fait beaucoup d'icône, ça :mrgreen: )

le but est simple, c'est de faire un dessin sous photoshop avec de la tranparence complète ou partielle( effet de fondu), de l'enregistrer en BMP sur fond blanc et sur fond noir puis d'obtenir un icône.

donc le code, il est comme d'habitude peu commenté mais je me tient à dispo en cas de question.


Code : Tout sélectionner

Global Taille

Declare Compilation_XP(Fichier.s)
Declare Compilation_VC(Fichier.s)


; Chargement des images
UseJPEGImageDecoder()
UsePNGImageDecoder()

ImageB.s = OpenFileRequester("Image avec le fond blanc", "Image - Fond blanc.bmp", "Image|*.bmp;*.png;*.jpg", 1)
If ImageB
  If LoadImage(0, ImageB)
    If ImageHeight() = ImageWidth()
      Select ImageHeight()
        Case 16
          Taille = 16
        Case 32
          Taille = 32
        Case 48
          Taille = 48
        Default
          MessageRequester("Erreur", "La taille de l'image n'est pas égale à 16x16, 32x32 ou 48x48", 0)
          End
      EndSelect
    Else
      MessageRequester("Erreur", "La largeur de l'image est différente de la hauteur", 0)
      End
    EndIf
  Else
    MessageRequester("Erreur", "Impossible de charger l'image", 0)
    End
  EndIf
Else
  End
EndIf

ImageN.s = OpenFileRequester("Image avec le fond blanc", "Image - Fond noir.bmp", "Image|*.bmp;*.png;*.jpg", 1)
If ImageN
  If LoadImage(1, ImageN)
    If ImageHeight() <> Taille Or ImageWidth() <> Taille
      MessageRequester("Erreur", "La largeur de l'image est différente de la hauteur", 0)
      End
    EndIf
  Else
    MessageRequester("Erreur", "Impossible de charger l'image", 0)
    End
  EndIf
Else
  End
EndIf




If OpenWindow(0, 0, 0, 300, 225, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; Affichage des images
Frame3DGadget(10, 5, 0, 140, 75, "Image avec le fond blanc")
ImageGadget(0, 20, 20, Taille, Taille, UseImage(0))
Frame3DGadget(11, 155, 0, 140, 75, "Image avec le fond noir")
ImageGadget(1, 170, 20, Taille, Taille, UseImage(1))

; Création des tableaux

Dim ImageB(Taille - 1, Taille - 1)
Dim ImageN(Taille - 1, Taille - 1)
Dim Masque(Taille - 1, Taille - 1)

; On encode les images
UseImage(0)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      ImageB(n, nn) = Point(n, nn)
    Next
  Next
StopDrawing()

UseImage(1)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      ImageN(n, nn) = Point(n, nn)
    Next
  Next
StopDrawing()

; Calcul de l'image et du masque
For n = 0 To Taille - 1
  For nn = 0 To Taille - 1
    
    If ImageB(n, nn) <> ImageN(n, nn)
      
      Red0 = Red(ImageB(n, nn))
      Red1 = Red(ImageN(n, nn))
      Green0 = Green((ImageB(n, nn)))
      Green1 = Green((ImageN(n, nn)))
      Blue0 = Blue((ImageB(n, nn)))
      Blue1 = Blue((ImageN(n, nn)))
      
      Masque(n, nn) = Int((255 - Red0 + Red1 + 255 - Green0 + Green1 + 255 - Blue0 + Blue1) / 3 + 0.5)
      ImageN(n, nn) = RGB(Int(Red1 * 255 / Masque(n, nn) + 0.5), Int(Green1 * 255 / Masque(n, nn) + 0.5), Int(Blue1 * 255 / Masque(n, nn) + 0.5))
    
    Else
      Masque(n, nn) = 255
    EndIf
    
  Next
Next

; Dessin de l'image
CreateImage(2, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, ImageN(n, nn))
    Next
  Next
StopDrawing()

; Dessin du masque
CreateImage(3, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, RGB(255 - Masque(n, nn), 255 - Masque(n, nn), 255 - Masque(n, nn)))
    Next
  Next
StopDrawing()

; On affiche l'image et le masque
Frame3DGadget(12, 5, 80, 140, 75, "Image")
ImageGadget(2, 20, 100, Taille, Taille, UseImage(2))
Frame3DGadget(13, 155, 80, 140, 75, "Masque")
ImageGadget(3, 170, 100, Taille, Taille, UseImage(3))

ButtonGadget(20, 5, 160, 290, 22, "Enregistrer l'icône au format XP")
ButtonGadget(21, 5, 184, 290, 22, "Enregistrer l'icône au format Vrai Couleur")
CheckBoxGadget(22, 5, 208, 290, 15, "Ouvrir l'icône après l'enregistrement")

Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Select EventGadgetID() ; boutons, zone de texte, ...
      Case 20
        Fichier.s = SaveFileRequester("Icône", "Icône XP - " + Str(Taille), "Icône|*.ico", 1)
        If Fichier
          If LCase(Right(Fichier, 4)) <> ".ico"
            Fichier = Fichier + ".ico"
          EndIf
          If IsFilename(GetFilePart(Fichier))
            Compilation_XP(Fichier)
            If GetGadgetState(22)
              RunProgram(Fichier)
            EndIf
          EndIf
        EndIf
      Case 21
        Fichier.s = SaveFileRequester("Icône", "Icône Vrai Couleur - " + Str(Taille), "Icône|*.ico", 1)
        If Fichier
          If LCase(Right(Fichier, 4)) <> ".ico"
            Fichier = Fichier + ".ico"
          EndIf
          If IsFilename(GetFilePart(Fichier))
            Compilation_VC(Fichier)
            If GetGadgetState(22)
              RunProgram(Fichier)
            EndIf
          EndIf
        EndIf
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow

End

Procedure Compilation_VC(Fichier.s)
  
EndProcedure

Procedure Compilation_XP(Fichier.s)
  If CreateFile(0, Fichier)
    
    ; On copie l'entête
    Select Taille
      Case 16
        Restore Icone16
      Case 32
        Restore Icone32
      Case 48
        Restore Icone48
    EndSelect
    
    For n = 1 To 62
      Read lecture.b
      UseFile(0)
      WriteByte(lecture)
    Next
    
    ; On enregistre l'image
    UseFile(0)
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille - 1
        ; Composante bleu de la couleur
        Couleur.l = Blue(ImageN(nn, n))
        If Couleur > 127
          Bleu.b = Couleur - 256
        Else
          Bleu = Couleur
        EndIf
        WriteByte(Bleu)
        ; Composante vert de la couleur
        Couleur.l = Green(ImageN(nn, n))
        If Couleur > 127
          Vert.b = Couleur - 256
        Else
          Vert = Couleur
        EndIf
        WriteByte(Vert)
        ; Composante rouge de la couleur
        Couleur.l = Red(ImageN(nn, n))
        If Couleur > 127
          Rouge.b = Couleur - 256
        Else
          Rouge = Couleur
        EndIf
        WriteByte(Rouge)
        
        ; Niveau de transparence de la couleur
        ; 0 = transparent
        ; 255 = opaque
        Couleur = Masque(nn, n)
        If Couleur > 127
          Masque.b = Couleur - 256
        Else
          Masque = Couleur
        EndIf
        WriteByte(Masque)
        
      Next
    Next
    
    ; Ecriture du masque classique
    UseFile(0)
    Cpt = 0
    MasqueBinaire.b = 0
    For n = Taille - 1 To 0 Step -1
      For nn = 0 To Taille - 1
        Cpt + 1
        ; le masque est en binaire, un 1 signifie que le point est transparent
        If Masque(nn, n) = 0
          Select Cpt
            Case 1
              MasqueBinaire = MasqueBinaire + %10000000
            Case 2
              MasqueBinaire = MasqueBinaire + %01000000
            Case 3
              MasqueBinaire = MasqueBinaire + %00100000
            Case 4
              MasqueBinaire = MasqueBinaire + %00010000
            Case 5
              MasqueBinaire = MasqueBinaire + %00001000
            Case 6
              MasqueBinaire = MasqueBinaire + %00000100
            Case 7
              MasqueBinaire = MasqueBinaire + %00000010
            Case 8
              MasqueBinaire = MasqueBinaire + %00000001
          EndSelect
        EndIf
        
        If Cpt = 8
          WriteByte(MasqueBinaire)
          Cpt = 0
          MasqueBinaire = 0
        EndIf
      Next
      
      ; on complete avec les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
      Select Taille
        Case 16
          If n / 2 = Int(n / 2) ; une ligne sur 2
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
        Case 16
          ; pas de ligne vide
        Case 48
          If n / 3 = Int(n / 3) ; une ligne sur 3
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
      EndSelect
      
    Next
    
    
    
    CloseFile(0)
  EndIf
EndProcedure

DataSection
  Icone16 :
    Data.b 0, 0, 1, 0, 1, 0, 16, 16, 0, 0, 1, 0, 32, 0, 104, 4, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone32 :
    Data.b 0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 32, 0, -88, 16, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone48 :
    Data.b 0, 0, 1, 0, 1, 0, 48, 48, 0, 0, 1, 0, 32, 0, -88, 37, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 96, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EndDataSection
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Pas mal sauf qu'il faudrait ajouter une tolérence au blanc de l'image afin d'inclure les pixels qui sont presque blanc lors de la création du masque de transparence.

Et si tu veux t'amuser encore plus regarde la procédure suivante :

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=733&highlight=
; Author: Mischa
; Date: 23. April 2003


; DrawTransparentImage (eine weitere Methode)
; abgewandelte (Profan-)Vorlage (im Original von Andreas Miethe)
;- -------------------------------------------------------------
;
; Zunächst sei gesagt: Nicht abschrecken lassen von diesem "Prozedur-Wurm",
; Er ist durchaus effektiv. ;) (Mal auf die Zeit im Fenster-Titel achten!)
;
; Was tut die Funktion:
;- --------------------
; Ein Image auf ein anderes Image "transparent" zeichnen (vgl. DisplayTransparentSprite())
; Zusätzlich wird auf Wunsch die Größe verändert und ein Offset kann auch angegeben werden.
;
; Funktion:
;- --------
; DrawTransparentImage(TransImage,ZielImage,x,y,b,h,offx,offy,offb,offh,TransColor)
;
; Parameter:
;- ---------
; TransImage   =   Image-Nummer des transparent darzustellenden Image
; ZielImage   =   Image-Nummer des Image auf dem das transparente Image gezeichnet werden soll
; x   =   X-Position innerhalb des ZielImage
; y   =   Y-Position innerhalb des ZielImage
; b   =   Neue Breite
; h   =   Neue Höhe
; offx   =   X-Offset innerhalb des TransImage
; offy   =   Y-Offset innerhalb des TransImage
; offb   =   Offset-Breite innerhalb des TransImage
; offh   =   Offset-Höhe innerhalb des TransImage
; TransColor   =   Transparent zu setzende Farbe in TransImage (RGB(r,g,b))
; (-1 bedeutet Pixel rechts/oben ist transparente Farbe)


Procedure DrawTransparentImage(TransImage, ZielImage, x, y, b, h, offx, offy, offb, offh, TransColor)
     UseImage(TransImage) : hdc = StartDrawing(ImageOutput())
          hzwischen = CreateCompatibleBitmap_(hdc, b, h)
          HdcTemp = CreateCompatibleDC_(hdc)
          obj = SelectObject_(HdcTemp, hzwischen)
          HdcBack = CreateCompatibleDC_(hdc)
          HdcObject = CreateCompatibleDC_(hdc)
          HdcMem = CreateCompatibleDC_(hdc)
          HdcSave = CreateCompatibleDC_(hdc)
          BmPAndBack = CreateBitmap_(b, h, 1, 1, 0)
          BmPAndObject = CreateBitmap_(b, h, 1, 1, 0)
          BmPAndMem = CreateCompatibleBitmap_(hdc, b, h)
          BmPSave = CreateCompatibleBitmap_(hdc, b, h)
          SetMapMode_(HdcTemp, GetMapMode_(hdc))
          BmpBackOld = SelectObject_(HdcBack, BmPAndBack)
          BmpObjectOld = SelectObject_(HdcObject, BmpAndObject)
          BmpMemOld = SelectObject_(HdcMem, BmpAndMem)
          BmpSaveOld = SelectObject_(HdcSave, BmpSave)
          SetStretchBltMode_(HdcTemp, #COLORONCOLOR)
          StretchBlt_(HdcTemp, 0, 0, b, h, hdc, offx, offy, offb, offh, 13369376)
          If TransColor = -1
               TransColor = GetPixel_(HdcTemp, (b - 1), 0)
          EndIf
          SetMapMode_(HdcTemp, GetMapMode_(hdc))
          BitBlt_(HdcSave, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020)
          CColor = SetBkColor_(HdcTemp, TransColor)
          BitBlt_(HdcObject, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020)
          SetBkColor_(HdcTemp, RGB(255, 255, 255))
     StopDrawing()
     UseImage(ZielImage) : target = StartDrawing(ImageOutput())
          BitBlt_(HdcBack, 0, 0, b, h, HdcObject, 0, 0, $0330008)
          BitBlt_(HdcMem, 0, 0, b, h, target, x, y, $0CC0020)
          BitBlt_(HdcMem, 0, 0, b, h, HdcObject, 0, 0, $08800C6)
          BitBlt_(HdcTemp, 0, 0, b, h, HdcBack, 0, 0, $08800C6)
          BitBlt_(HdcMem, 0, 0, b, h, HdcTemp, 0, 0, $0EE0086)
          BitBlt_(HdcTemp, 0, 0, b, h, HdcMem, 0, 0, $0CC0020)
          BitBlt_(target, x, y, b, h, HdcTemp, 0, 0, $0CC0020)
     StopDrawing()
     DeleteObject_(obj) : DeleteObject_(BmpBackOld)
     DeleteObject_(BmpObjectOld) : DeleteObject_(BmpMemOld)
     DeleteObject_(BmpSaveOld) : DeleteDC_(HdcMem)
     DeleteDC_(HdcBack) : DeleteDC_(HdcObject)
     DeleteDC_(HdcSave) : DeleteDC_(HdcTemp)
     DeleteObject_(hzwischen) : DeleteObject_(BmPAndBack)
     DeleteObject_(BmPAndObject) : DeleteObject_(BmPAndMem)
     DeleteObject_(BmPSave)
EndProcedure
N.B. Je l'ai récupéré sur code archive je crois. Je l'utilise pour créer des ButtonImageGadget. Oh en passant, j'ai essayé d'en faire un librairie avec Tailbite et ça plante, si quelqu'un comprends pourquoi...

Code : Tout sélectionner

LoadImage(#Image_Fleche_droite_200, "Images\Fleche droite 200.bmp")
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Boucle de création des boutons
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 1. On creer le fond de l'image pour les boutons de la même couleur que les fenètres windows.
; 2. On dessine l'image par dessus le fond pour avoir un effet de transparence.
; 3. On redimensionne les images à la taille des boutons.
Largeur = ImageWidth()
Hauteur = ImageHeight()
Bouton = #Image_Fleche_gauche_200
For background = #Icone_precedente To #Icone_suivante
     CreateImage(background, Largeur, Hauteur)
     StartDrawing(ImageOutput())
          Box(0, 0, Largeur, Hauteur, GetSysColor_(#COLOR_3DFACE))
     StopDrawing()
     DrawTransparentImage(Bouton, background, 0, 0, Largeur, Hauteur, 0, 0, Largeur, Hauteur, -1)
     Bouton = Bouton + 1
     ResizeImage(background, 60, 60)
Next
Tu pourrais facilement éviter d'avoir à charger 2 images. Tu charge une image avec le fond blanc et tu dessine l'autre sur fond noir en réutilisant l'image sur fond blanc.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

non, il est indipensable d'avoir les 2 pour généré une copie parfaite de l'image crée sous photoshop.

je ne comprend pas pourquoi tu me demande de filtrer les points clair, tu es sous XP ou pas ?
car sinon, tu te retrouves avec un icone plutot grossier (vu que seul XP supporte la transparence partiel)

un exemple en image :

l'image sur fond blanc et sur fond noir
Image Image

ce qui donne une icône avec tranparence que j'ai mis ici sur un dégradé de gris :
Image
Pour ceux qui n'ont pas XP, regardez plus particulierement la netteté des bords de l'image et et l'effet de fondu pour l'ombre
N.B. : si vous téléchargez ces 2 images, vous pourrez les ouvrir avec mon codes pour faire l'icône :wink:


sinon pour tailbite, ton code ne marche pas à cause du useimage(), il faut envoyer directement le handle de l'image à la procedure et non le numero de l'image
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

beuh, elles sont magnifiques ces icones !

dommage que ce ne soit que pour XP !!!

allez , régis pond nous un code pour avoir des zoulies icones comme ça pour tous les zins 98/meumeu/2K !!!

allez , chiche !!!

patrick
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

c'est en cours ;)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

non !? raaaaaaaaaaaaaaaaaaaa

regis ! P R E S I D E N T
regis ! P R E S I D E N T
regis ! P R E S I D E N T
regis ! P R E S I D E N T
regis ! P R E S I D E N T
regis ! P R E S I D E N T

OUAISSSSSSS
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

beau travail regis 8)
Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

le code qui permet de lire un icône au format XP ou vraie couleur pour créer des images

attention, il faut un icône tous simple avec un seul format.

il supporte le 16*16, 32*32, 48*48 et vraie couleur ou XP.

Faut que j'arrive à lire un icône multi format pour faire un déssassembleur d'icones et un assembleur d'icônes. j'ai pas encore essayé.

Code : Tout sélectionner

Global Type.l, Taille.l

Declare Sauve_Image(File.s)


Fichier.s = OpenFileRequester("Icône", "Icône.ico", "Icône|*.ico", 1)
If LCase(Right(Fichier, 4)) = ".ico"
  Fichier = Left(Fichier, Len(Fichier) - 4)
EndIf

If OpenFile(0, Fichier + ".ico") ; on ouvre le fichier
  
  ; On recherche le type de l'icône
  
  Mem = AllocateMemory(62)
  ReadData(Mem, 62)
  
  If CompareMemory(Mem, ?Icone16XP, 62)
    Type = 2
    Taille = 16
  ElseIf CompareMemory(Mem, ?Icone32XP, 62)
    Type = 2
    Taille = 32
  ElseIf CompareMemory(Mem, ?Icone48XP, 62)
    Type = 2
    Taille = 48
  ElseIf CompareMemory(Mem, ?Icone16VC, 62)
    Type = 1
    Taille = 16
  ElseIf CompareMemory(Mem, ?Icone32VC, 62)
    Type = 1
    Taille = 32
  ElseIf CompareMemory(Mem, ?Icone48VC, 62)
    Type = 1
    Taille = 48
  Else
    MessageRequester("Erreur", "Type de fichier inconnu", 0)
    End
  EndIf
  
  Dim Image.l(Taille, Taille) ; création des cartes
  Dim Masque.l(Taille, Taille)
  
  If Type = 1
    
    ; Lecture de l'image
    FileSeek(62)
    
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille - 1
        ; Composante bleu de la couleur
        Bleu.l = ReadByte()
        If Bleu < 0
          Bleu = 256 + Bleu
        EndIf
        ; Composante vert de la couleur
        Vert.l = ReadByte()
        If Vert < 0
          Vert = 256 + Vert
        EndIf
        ; Composante rouge de la couleur
        Rouge.l = ReadByte()
        If Rouge < 0
          Rouge = 256 + Rouge
        EndIf
        
        Image(nn, n) = RGB(Rouge, Vert, Bleu)
      Next
    Next
    
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille / 8 - 1
        
        MasqueBinaire.b = ReadByte()
        
        ; le masque est en binaire, un 1 signifie que le point est transparent
        If MasqueBinaire & %10000000
          Masque(nn * 8, n) = 0
        Else
          Masque(nn * 8, n) = 255
        EndIf
        If MasqueBinaire & %01000000
          Masque(nn * 8 + 1, n) = 0
        Else
          Masque(nn * 8 + 1, n) = 255
        EndIf
        If MasqueBinaire & %00100000
          Masque(nn * 8 + 2, n) = 0
        Else
          Masque(nn * 8 + 2, n) = 255
        EndIf
        If MasqueBinaire & %00010000
          Masque(nn * 8 + 3, n) = 0
        Else
          Masque(nn * 8 + 3, n) = 255
        EndIf
        If MasqueBinaire & %00001000
          Masque(nn * 8 + 4, n) = 0
        Else
          Masque(nn * 8 + 4, n) = 255
        EndIf
        If MasqueBinaire & %00000100
          Masque(nn * 8 + 5, n) = 0
        Else
          Masque(nn * 8 + 5, n) = 255
        EndIf
        If MasqueBinaire & %00000010
          Masque(nn * 8 + 6, n) = 0
        Else
          Masque(nn * 8 + 6, n) = 255
        EndIf
        If MasqueBinaire & %00000001
          Masque(nn * 8 + 7, n) = 0
        Else
          Masque(nn * 8 + 7, n) = 255
        EndIf
        
      Next
      
      ; on lit les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
      Select Taille
        Case 16
          If n / 2 = Int(n / 2) ; une ligne sur 2
            For i = 1 To 2
              ReadByte()
            Next
          EndIf
        Case 16
          ; pas de ligne vide
        Case 48
          If n / 3 = Int(n / 3) ; une ligne sur 3
            For i = 1 To 2
              ReadByte()
            Next
          EndIf
      EndSelect
      
    Next
    
  Else
    
    ; Lecture de l'image et du masque
    FileSeek(62)
    
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille - 1
        ; Composante bleu de la couleur
        Bleu.l = ReadByte()
        If Bleu < 0
          Bleu = 256 + Bleu
        EndIf
        ; Composante vert de la couleur
        Vert.l = ReadByte()
        If Vert < 0
          Vert = 256 + Vert
        EndIf
        ; Composante rouge de la couleur
        Rouge.l = ReadByte()
        If Rouge < 0
          Rouge = 256 + Rouge
        EndIf
        
        Image(nn, n) = RGB(Rouge, Vert, Bleu)
        
        ; Niveau de transparence de la couleur
        ; 0 = transparent
        ; 255 = opaque
        Masque = ReadByte()
        If Masque < 0
          Masque = 256 + Masque
        EndIf
        Masque(nn, n) = Masque
        
      Next
    Next
    
  EndIf
  
  CloseFile(0)
EndIf

; Dessin de l'image
CreateImage(0, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, Image(n, nn))
    Next
  Next
StopDrawing()

; Dessin du masque
CreateImage(1, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, RGB(255 - Masque(n, nn), 255 - Masque(n, nn), 255 - Masque(n, nn)))
    Next
  Next
StopDrawing()

; Affichage à l'écran
If OpenWindow(0, 0, 0, 300, 105, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Encoder une icône en images")
  If CreateGadgetList(WindowID())
    Frame3DGadget(10, 5, 0, 140, 75, "Image")
    ImageGadget(0, 20, 20, Taille, Taille, UseImage(0))
    Frame3DGadget(11, 155, 0, 140, 75, "Masque")
    ImageGadget(1, 170, 20, Taille, Taille, UseImage(1))
    ButtonGadget(20, 5, 80, 290, 22, "Enregistrer l'icône sous forme d'images")
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_EventGadget
      Select EventGadgetID() ; boutons, zone de texte, ...
        Case 20
          Fichier.s = SaveFileRequester("Image", Fichier, "Image|*.bmp", 1)
          If Fichier
            If LCase(Right(Fichier, 4)) = ".bmp"
              Fichier = Left(Fichier, Len(Fichier) - 4)
            EndIf
            If LCase(Right(Fichier, 13)) = " [fond blanc]"
              Fichier = Left(Fichier, Len(Fichier) - 13)
            EndIf
            If LCase(Right(Fichier, 12)) = " [fond noir]"
              Fichier = Left(Fichier, Len(Fichier) - 12)
            EndIf
            If IsFilename(GetFilePart(Fichier))
              Sauve_Image(Fichier)
            EndIf
          EndIf
      EndSelect
    EndIf
    
  Until Event = #WM_CLOSE
  
EndIf

Procedure CreationImage(NumImage.l, CouleurFond.l)
  FreeImage(NumImage)
  CreateImage(NumImage, Taille, Taille)
  StartDrawing(ImageOutput())
    For n = 0 To Taille - 1
      For nn = 0 To Taille - 1
        Rouge = Red(Image(n, nn))
        Vert = Green(Image(n, nn))
        Bleu = Blue(Image(n, nn))
        
        Masque.f = Masque(n, nn) / 255
        
        Rouge = Int(Rouge * Masque + CouleurFond * (1 - Masque) + 0.5)
        Vert = Int(Vert * Masque + CouleurFond * (1 - Masque) + 0.5)
        Bleu = Int(Bleu * Masque + CouleurFond * (1 - Masque) + 0.5)
        
        Plot(n, nn, RGB(Rouge, Vert, Bleu))
      Next
    Next
  StopDrawing()
EndProcedure

Procedure Sauve_Image(File.s)
  Fichier.s = File + " [Fond blanc].bmp"
  CreationImage(0, 255)
  SaveImage(0, Fichier)
  SetGadgetText(10, "Image avec le fond blanc")
  SetGadgetState(0, UseImage(0))
  Fichier = File + " [Fond noir].bmp"
  CreationImage(1, 0)
  SaveImage(1, Fichier)
  SetGadgetText(11, "Image avec le fond noir")
  SetGadgetState(1, UseImage(1))
EndProcedure


DataSection
  Icone16VC :
    Data.b 0, 0, 1, 0, 1, 0, 16, 16, 0, 0, 1, 0, 24, 0, 104, 3, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone32VC :
    Data.b 0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 24, 0, -88, 12, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, -128, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone48VC :
    Data.b 0, 0, 1, 0, 1, 0, 48, 48, 0, 0, 1, 0, 24, 0, -88, 28, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 96, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, -128, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone16XP :
    Data.b 0, 0, 1, 0, 1, 0, 16, 16, 0, 0, 1, 0, 32, 0, 104, 4, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone32XP :
    Data.b 0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 32, 0, -88, 16, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone48XP :
    Data.b 0, 0, 1, 0, 1, 0, 48, 48, 0, 0, 1, 0, 32, 0, -88, 37, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 96, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EndDataSection
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

la version qui permet de créer les icônes au format XP et vrai couleur

Code : Tout sélectionner

Global Taille

Declare Compilation_XP(Fichier.s)
Declare Compilation_VC(Fichier.s)


; Chargement des images
UseJPEGImageDecoder()
UsePNGImageDecoder()

ImageB.s = OpenFileRequester("Image avec le fond blanc", "Image [Fond blanc].bmp", "Image|*.bmp;*.png;*.jpg", 1)
If ImageB
  If LoadImage(0, ImageB)
    If ImageHeight() = ImageWidth()
      Select ImageHeight()
        Case 16
          Taille = 16
        Case 32
          Taille = 32
        Case 48
          Taille = 48
        Default
          MessageRequester("Erreur", "La taille de l'image n'est pas égale à 16x16, 32x32 ou 48x48", 0)
          End
      EndSelect
    Else
      MessageRequester("Erreur", "La largeur de l'image est différente de la hauteur", 0)
      End
    EndIf
  Else
    MessageRequester("Erreur", "Impossible de charger l'image", 0)
    End
  EndIf
Else
  End
EndIf

ImageN.s = OpenFileRequester("Image avec le fond blanc", "Image [Fond noir].bmp", "Image|*.bmp;*.png;*.jpg", 1)
If ImageN
  If LoadImage(1, ImageN)
    If ImageHeight() <> Taille Or ImageWidth() <> Taille
      MessageRequester("Erreur", "La largeur de l'image est différente de la hauteur", 0)
      End
    EndIf
  Else
    MessageRequester("Erreur", "Impossible de charger l'image", 0)
    End
  EndIf
Else
  End
EndIf




If OpenWindow(0, 0, 0, 300, 225, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Encoder en icône") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; Affichage des images
Frame3DGadget(10, 5, 0, 140, 75, "Image avec le fond blanc")
ImageGadget(0, 20, 20, Taille, Taille, UseImage(0))
Frame3DGadget(11, 155, 0, 140, 75, "Image avec le fond noir")
ImageGadget(1, 170, 20, Taille, Taille, UseImage(1))

; Création des tableaux

Dim ImageB(Taille - 1, Taille - 1)
Dim ImageN(Taille - 1, Taille - 1)
Dim Masque(Taille - 1, Taille - 1)

; On encode les images
UseImage(0)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      ImageB(n, nn) = Point(n, nn)
    Next
  Next
StopDrawing()

UseImage(1)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      ImageN(n, nn) = Point(n, nn)
    Next
  Next
StopDrawing()

; Calcul de l'image et du masque
For n = 0 To Taille - 1
  For nn = 0 To Taille - 1
    
    If ImageB(n, nn) <> ImageN(n, nn)
      
      Red0 = Red(ImageB(n, nn))
      Red1 = Red(ImageN(n, nn))
      Green0 = Green((ImageB(n, nn)))
      Green1 = Green((ImageN(n, nn)))
      Blue0 = Blue((ImageB(n, nn)))
      Blue1 = Blue((ImageN(n, nn)))
      
      Masque(n, nn) = Int((255 - Red0 + Red1 + 255 - Green0 + Green1 + 255 - Blue0 + Blue1) / 3 + 0.5)
      ImageN(n, nn) = RGB(Int(Red1 * 255 / Masque(n, nn) + 0.5), Int(Green1 * 255 / Masque(n, nn) + 0.5), Int(Blue1 * 255 / Masque(n, nn) + 0.5))
    
    Else
      Masque(n, nn) = 255
    EndIf
    
  Next
Next

; Dessin de l'image
CreateImage(2, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, ImageN(n, nn))
    Next
  Next
StopDrawing()

; Dessin du masque
CreateImage(3, Taille, Taille)
StartDrawing(ImageOutput())
  For n = 0 To Taille - 1
    For nn = 0 To Taille - 1
      Plot(n, nn, RGB(255 - Masque(n, nn), 255 - Masque(n, nn), 255 - Masque(n, nn)))
    Next
  Next
StopDrawing()

; On affiche l'image et le masque
Frame3DGadget(12, 5, 80, 140, 75, "Image")
ImageGadget(2, 20, 100, Taille, Taille, UseImage(2))
Frame3DGadget(13, 155, 80, 140, 75, "Masque")
ImageGadget(3, 170, 100, Taille, Taille, UseImage(3))

ButtonGadget(20, 5, 160, 290, 22, "Enregistrer l'icône au format XP")
ButtonGadget(21, 5, 184, 290, 22, "Enregistrer l'icône au format Vrai Couleur")
CheckBoxGadget(22, 5, 208, 290, 15, "Ouvrir l'icône après l'enregistrement")

Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Select EventGadgetID() ; boutons, zone de texte, ...
      Case 20
        Fichier.s = SaveFileRequester("Icône", "Icône [XP - " + Str(Taille) + "].ico", "Icône|*.ico", 1)
        If Fichier
          If LCase(Right(Fichier, 4)) <> ".ico"
            Fichier = Fichier + ".ico"
          EndIf
          If IsFilename(GetFilePart(Fichier))
            Compilation_XP(Fichier)
            If GetGadgetState(22)
              RunProgram(Fichier)
            EndIf
          EndIf
        EndIf
      Case 21
        Fichier.s = SaveFileRequester("Icône", "Icône [Vrai Couleur - " + Str(Taille) + "].ico", "Icône|*.ico", 1)
        If Fichier
          If LCase(Right(Fichier, 4)) <> ".ico"
            Fichier = Fichier + ".ico"
          EndIf
          If IsFilename(GetFilePart(Fichier))
            Compilation_VC(Fichier)
            If GetGadgetState(22)
              RunProgram(Fichier)
            EndIf
          EndIf
        EndIf
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow

End

Procedure Compilation_VC(Fichier.s)
  #LimiteTransparence = 127

  If CreateFile(0, Fichier)
    
    ; On copie l'entête
    Select Taille
      Case 16
        Restore Icone16VC
      Case 32
        Restore Icone32VC
      Case 48
          Restore Icone48VC
    EndSelect
    
    For n = 1 To 62
      Read lecture.b
      UseFile(0)
      WriteByte(lecture)
    Next
    
    ; On enregistre l'image
    UseFile(0)
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille - 1
        ; Composante bleu de la couleur
        
        If Masque(nn, n) >= #LimiteTransparence
          CouleurImage = ImageB(nn, n)
          
;           Masque.f = (Masque(nn, n) + #LimiteTransparence) / (255 + #LimiteTransparence)
;         
;           r = Int(Red(CouleurImage) * Masque + Red(ImageN(nn, n)) * (1 - Masque) + 0.5)
;           v = Int(Green(CouleurImage) * Masque + Green(ImageN(nn, n))  * (1 - Masque) + 0.5)
;           b = Int(Blue(CouleurImage) * Masque + Blue(ImageN(nn, n))  * (1 - Masque) + 0.5)
;           
;           CouleurImage = RGB(r, v, b)
          
        Else
          CouleurImage = 0
        EndIf
        
        Couleur.l = Blue(CouleurImage)
        If Couleur > 127
          Bleu.b = Couleur - 256
        Else
          Bleu = Couleur
        EndIf
        WriteByte(Bleu)
        ; Composante vert de la couleur
        Couleur.l = Green(CouleurImage)
        If Couleur > 127
          Vert.b = Couleur - 256
        Else
          Vert = Couleur
        EndIf
        WriteByte(Vert)
        ; Composante rouge de la couleur
        Couleur.l = Red(CouleurImage)
        If Couleur > 127
          Rouge.b = Couleur - 256
        Else
          Rouge = Couleur
        EndIf
        WriteByte(Rouge)
        
      Next
    Next
    
    ; Ecriture du masque classique
    UseFile(0)
    Cpt = 0
    MasqueBinaire.b = 0
    For n = Taille - 1 To 0 Step -1
      For nn = 0 To Taille - 1
        Cpt + 1
        ; le masque est en binaire, un 1 signifie que le point est transparent
        If Masque(nn, n) < #LimiteTransparence
          Select Cpt
            Case 1
              MasqueBinaire = MasqueBinaire + %10000000
            Case 2
              MasqueBinaire = MasqueBinaire + %01000000
            Case 3
              MasqueBinaire = MasqueBinaire + %00100000
            Case 4
              MasqueBinaire = MasqueBinaire + %00010000
            Case 5
              MasqueBinaire = MasqueBinaire + %00001000
            Case 6
              MasqueBinaire = MasqueBinaire + %00000100
            Case 7
              MasqueBinaire = MasqueBinaire + %00000010
            Case 8
              MasqueBinaire = MasqueBinaire + %00000001
          EndSelect
        EndIf
        
        If Cpt = 8
          WriteByte(MasqueBinaire)
          Cpt = 0
          MasqueBinaire = 0
        EndIf
      Next
      
      ; on complete avec les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
      Select Taille
        Case 16
          If n / 2 = Int(n / 2) ; une ligne sur 2
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
        Case 16
          ; pas de ligne vide
        Case 48
          If n / 3 = Int(n / 3) ; une ligne sur 3
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
      EndSelect
      
    Next
    
    
    
    CloseFile(0)
  EndIf
EndProcedure

Procedure Compilation_XP(Fichier.s)
  If CreateFile(0, Fichier)
    
    ; On copie l'entête
    Select Taille
      Case 16
        Restore Icone16XP
      Case 32
        Restore Icone32XP
      Case 48
        Restore Icone48XP
    EndSelect
    
    For n = 1 To 62
      Read lecture.b
      UseFile(0)
      WriteByte(lecture)
    Next
    
    ; On enregistre l'image
    UseFile(0)
    For n = Taille - 1 To 0 Step - 1
      For nn = 0 To Taille - 1
        ; Composante bleu de la couleur
        Couleur.l = Blue(ImageN(nn, n))
        If Couleur > 127
          Bleu.b = Couleur - 256
        Else
          Bleu = Couleur
        EndIf
        WriteByte(Bleu)
        ; Composante vert de la couleur
        Couleur.l = Green(ImageN(nn, n))
        If Couleur > 127
          Vert.b = Couleur - 256
        Else
          Vert = Couleur
        EndIf
        WriteByte(Vert)
        ; Composante rouge de la couleur
        Couleur.l = Red(ImageN(nn, n))
        If Couleur > 127
          Rouge.b = Couleur - 256
        Else
          Rouge = Couleur
        EndIf
        WriteByte(Rouge)
        
        ; Niveau de transparence de la couleur
        ; 0 = transparent
        ; 255 = opaque
        Couleur = Masque(nn, n)
        If Couleur > 127
          Masque.b = Couleur - 256
        Else
          Masque = Couleur
        EndIf
        WriteByte(Masque)
        
      Next
    Next
    
    ; Ecriture du masque classique
    UseFile(0)
    Cpt = 0
    MasqueBinaire.b = 0
    For n = Taille - 1 To 0 Step -1
      For nn = 0 To Taille - 1
        Cpt + 1
        ; le masque est en binaire, un 1 signifie que le point est transparent
        If Masque(nn, n) = 0
          Select Cpt
            Case 1
              MasqueBinaire = MasqueBinaire + %10000000
            Case 2
              MasqueBinaire = MasqueBinaire + %01000000
            Case 3
              MasqueBinaire = MasqueBinaire + %00100000
            Case 4
              MasqueBinaire = MasqueBinaire + %00010000
            Case 5
              MasqueBinaire = MasqueBinaire + %00001000
            Case 6
              MasqueBinaire = MasqueBinaire + %00000100
            Case 7
              MasqueBinaire = MasqueBinaire + %00000010
            Case 8
              MasqueBinaire = MasqueBinaire + %00000001
          EndSelect
        EndIf
        
        If Cpt = 8
          WriteByte(MasqueBinaire)
          Cpt = 0
          MasqueBinaire = 0
        EndIf
      Next
      
      ; on complete avec les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
      Select Taille
        Case 16
          If n / 2 = Int(n / 2) ; une ligne sur 2
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
        Case 16
          ; pas de ligne vide
        Case 48
          If n / 3 = Int(n / 3) ; une ligne sur 3
            For i = 1 To 2
              WriteByte(0)
            Next
          EndIf
      EndSelect
      
    Next
    
    
    
    CloseFile(0)
  EndIf
EndProcedure

DataSection
  Icone16VC :
    Data.b 0, 0, 1, 0, 1, 0, 16, 16, 0, 0, 1, 0, 24, 0, 104, 3, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone32VC :
    Data.b 0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 24, 0, -88, 12, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, -128, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone48VC :
    Data.b 0, 0, 1, 0, 1, 0, 48, 48, 0, 0, 1, 0, 24, 0, -88, 28, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 96, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, -128, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone16XP :
    Data.b 0, 0, 1, 0, 1, 0, 16, 16, 0, 0, 1, 0, 32, 0, 104, 4, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone32XP :
    Data.b 0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 32, 0, -88, 16, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Icone48XP :
    Data.b 0, 0, 1, 0, 1, 0, 48, 48, 0, 0, 1, 0, 32, 0, -88, 37, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 96, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, -128, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EndDataSection

donc avec les images suivantes sur fond blanc et sur fond noir
Image Image

on obtient une icône XP avec tranparence que j'ai mis ici sur un dégradé de gris :
Image
et une icône vrai couleur moins joli mais pas trop mal à condition que le fond reste clair
Image
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Le Soldat Inconnu a écrit : je ne comprend pas pourquoi tu me demande de filtrer les points clair, tu es sous XP ou pas ?
car sinon, tu te retrouves avec un icone plutot grossier (vu que seul XP supporte la transparence partiel)
Ben non je ne suis pas sur win XP. C'est pour cette raison que je demandais ça. Mais bon tu nous donne le code, on peut toujours le modifier...

Mais n'empèche que ça semble très bien ton code, comme toujours. Image

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Oui, quand on n'est pas sous XP, c'est l'icône vrai couleur, celui du bas dans mon précédent message ;)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
eddy
Messages : 67
Inscription : mer. 09/avr./2008 2:08

Message par eddy »

version PB4

Code : Tout sélectionner

Global Taille

Declare Compilation_XP(Fichier.s)
Declare Compilation_VC(Fichier.s)

; Chargement des images
UseJPEGImageDecoder()
UsePNGImageDecoder()

ImageB.s=OpenFileRequester("Image avec le fond blanc","Image [Fond blanc].bmp","Image|*.bmp;*.png;*.jpg",1)
If ImageB
   If LoadImage(0,ImageB)
      If ImageHeight(0)=ImageWidth(0)
         Select ImageHeight(0)
            Case 16
               Taille=16
            Case 32
               Taille=32
            Case 48
               Taille=48
            Default
               MessageRequester("Erreur","La taille de l'image n'est pas égale à 16x16, 32x32 ou 48x48",0)
               End
         EndSelect
      Else
         MessageRequester("Erreur","La largeur de l'image est différente de la hauteur",0)
         End
      EndIf
   Else
      MessageRequester("Erreur","Impossible de charger l'image",0)
      End
   EndIf
Else
   End
EndIf

ImageN.s=OpenFileRequester("Image avec le fond blanc","Image [Fond noir].bmp","Image|*.bmp;*.png;*.jpg",1)
If ImageN
   If LoadImage(1,ImageN)
      If ImageHeight(1)<>Taille Or ImageWidth(1)<>Taille
         MessageRequester("Erreur","La largeur de l'image est différente de la hauteur",0)
         End
      EndIf
   Else
      MessageRequester("Erreur","Impossible de charger l'image",0)
      End
   EndIf
Else
   End
EndIf




s=#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget
If OpenWindow(0,0,0,300,225,"Encoder en icône",s)=0 Or CreateGadgetList(WindowID(0))=0
   End
EndIf

; Affichage des images
Frame3DGadget(10,5,0,140,75,"Image avec le fond blanc")
ImageGadget(0,20,20,Taille,Taille,ImageID(0))
Frame3DGadget(11,155,0,140,75,"Image avec le fond noir")
ImageGadget(1,170,20,Taille,Taille,ImageID(1))

; Création des tableaux

Global Dim ImageB(Taille-1,Taille-1)
Global Dim ImageN(Taille-1,Taille-1)
Global Dim Masque(Taille-1,Taille-1)

; On encode les images
;UseImage(0)
StartDrawing(ImageOutput(0))
   For n=0 To Taille-1
      For nn=0 To Taille-1
         ImageB(n,nn)=Point(n,nn)
      Next
   Next
StopDrawing()

;UseImage(1)
StartDrawing(ImageOutput(1))
   For n=0 To Taille-1
      For nn=0 To Taille-1
         ImageN(n,nn)=Point(n,nn)
      Next
   Next
StopDrawing()

; Calcul de l'image et du masque
For n=0 To Taille-1
   For nn=0 To Taille-1
      
      If ImageB(n,nn)<>ImageN(n,nn)
         
         Red0=Red(ImageB(n,nn))
         Red1=Red(ImageN(n,nn))
         Green0=Green((ImageB(n,nn)))
         Green1=Green((ImageN(n,nn)))
         Blue0=Blue((ImageB(n,nn)))
         Blue1=Blue((ImageN(n,nn)))
         
         Masque(n,nn)=Int((255-Red0+Red1+255-Green0+Green1+255-Blue0+Blue1)/3+0.5)
         ImageN(n,nn)=RGB(Int(Red1*255/Masque(n,nn)+0.5),Int(Green1*255/Masque(n,nn)+0.5),Int(Blue1*255/Masque(n,nn)+0.5))
         
      Else
         Masque(n,nn)=255
      EndIf
      
   Next
Next

; Dessin de l'image
CreateImage(2,Taille,Taille)
StartDrawing(ImageOutput(2))
   For n=0 To Taille-1
      For nn=0 To Taille-1
         Plot(n,nn,ImageN(n,nn))
      Next
   Next
StopDrawing()

; Dessin du masque
CreateImage(3,Taille,Taille)
StartDrawing(ImageOutput(3))
   For n=0 To Taille-1
      For nn=0 To Taille-1
         Plot(n,nn,RGB(255-Masque(n,nn),255-Masque(n,nn),255-Masque(n,nn)))
      Next
   Next
StopDrawing()

; On affiche l'image et le masque
Frame3DGadget(12,5,80,140,75,"Image")
ImageGadget(2,20,100,Taille,Taille,ImageID(2))
Frame3DGadget(13,155,80,140,75,"Masque")
ImageGadget(3,170,100,Taille,Taille,ImageID(3))

ButtonGadget(20,5,160,290,22,"Enregistrer l'icône au format XP")
ButtonGadget(21,5,184,290,22,"Enregistrer l'icône au format Vrai Couleur")
CheckBoxGadget(22,5,208,290,15,"Ouvrir l'icône après l'enregistrement")

Repeat
   Event=WaitWindowEvent()
   
   If Event=#PB_Event_Gadget
      Select EventGadget() ; boutons, zone de texte, ...
         Case 20
            Fichier.s=SaveFileRequester("Icône","Icône [XP - "+Str(Taille)+"].ico","Icône|*.ico",1)
            If Fichier
               If LCase(Right(Fichier,4))<>".ico"
                  Fichier=Fichier+".ico"
               EndIf
               If FileSize(GetFilePart(Fichier))
                  Compilation_XP(Fichier)
                  If GetGadgetState(22)
                     RunProgram(Fichier)
                  EndIf
               EndIf
            EndIf
         Case 21
            Fichier.s=SaveFileRequester("Icône","Icône [Vrai Couleur - "+Str(Taille)+"].ico","Icône|*.ico",1)
            If Fichier
               If LCase(Right(Fichier,4))<>".ico"
                  Fichier=Fichier+".ico"
               EndIf
               If FileSize(GetFilePart(Fichier))
                  Compilation_VC(Fichier)
                  If GetGadgetState(22)
                     RunProgram(Fichier)
                  EndIf
               EndIf
            EndIf
      EndSelect
   EndIf
   
Until Event=#PB_Event_CloseWindow

End

Procedure Compilation_VC(Fichier.s)
   #LimiteTransparence=127
   
   If CreateFile(0,Fichier)
      
      ; On copie l'entête
      Select Taille
         Case 16
            Restore Icone16VC
         Case 32
            Restore Icone32VC
         Case 48
            Restore Icone48VC
      EndSelect
      
      For n=1 To 62
         Read lecture.b
         ;UseFile(0)
         WriteByte(0,lecture)
      Next
      
      ; On enregistre l'image
      ;UseFile(0)
      For n=Taille-1 To 0 Step -1
         For nn=0 To Taille-1
            ; Composante bleu de la couleur
            
            If Masque(nn,n)>=#LimiteTransparence
               CouleurImage=ImageB(nn,n)
               
               ;           Masque.f = (Masque(nn, n) + #LimiteTransparence) / (255 + #LimiteTransparence)
               ;
               ;           r = Int(Red(CouleurImage) * Masque + Red(ImageN(nn, n)) * (1 - Masque) + 0.5)
               ;           v = Int(Green(CouleurImage) * Masque + Green(ImageN(nn, n))  * (1 - Masque) + 0.5)
               ;           b = Int(Blue(CouleurImage) * Masque + Blue(ImageN(nn, n))  * (1 - Masque) + 0.5)
               ;
               ;           CouleurImage = RGB(r, v, b)
               
            Else
               CouleurImage=0
            EndIf
            
            Couleur.l=Blue(CouleurImage)
            If Couleur>127
               Bleu.b=Couleur-256
            Else
               Bleu=Couleur
            EndIf
            WriteByte(0,Bleu)
            ; Composante vert de la couleur
            Couleur.l=Green(CouleurImage)
            If Couleur>127
               Vert.b=Couleur-256
            Else
               Vert=Couleur
            EndIf
            WriteByte(0,Vert)
            ; Composante rouge de la couleur
            Couleur.l=Red(CouleurImage)
            If Couleur>127
               Rouge.b=Couleur-256
            Else
               Rouge=Couleur
            EndIf
            WriteByte(0,Rouge)
            
         Next
      Next
      
      ; Ecriture du masque classique
      ;UseFile(0)
      Cpt=0
      MasqueBinaire.b=0
      For n=Taille-1 To 0 Step -1
         For nn=0 To Taille-1
            Cpt+1
            ; le masque est en binaire, un 1 signifie que le point est transparent
            If Masque(nn,n)<#LimiteTransparence
               Select Cpt
                  Case 1
                     MasqueBinaire=MasqueBinaire+%10000000
                  Case 2
                     MasqueBinaire=MasqueBinaire+%01000000
                  Case 3
                     MasqueBinaire=MasqueBinaire+%00100000
                  Case 4
                     MasqueBinaire=MasqueBinaire+%00010000
                  Case 5
                     MasqueBinaire=MasqueBinaire+%00001000
                  Case 6
                     MasqueBinaire=MasqueBinaire+%00000100
                  Case 7
                     MasqueBinaire=MasqueBinaire+%00000010
                  Case 8
                     MasqueBinaire=MasqueBinaire+%00000001
               EndSelect
            EndIf
            
            If Cpt=8
               WriteByte(0,MasqueBinaire)
               Cpt=0
               MasqueBinaire=0
            EndIf
         Next
         
         ; on complete avec les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
         Select Taille
            Case 16
               If n/2=Int(n/2) ; une ligne sur 2
                  For i=1 To 2
                     WriteByte(0,0)
                  Next
               EndIf
            Case 16
               ; pas de ligne vide
            Case 48
               If n/3=Int(n/3) ; une ligne sur 3
                  For i=1 To 2
                     WriteByte(0,0)
                  Next
               EndIf
         EndSelect
         
      Next
      
      
      
      CloseFile(0)
   EndIf
EndProcedure

Procedure Compilation_XP(Fichier.s)
   If CreateFile(0,Fichier)
      
      ; On copie l'entête
      Select Taille
         Case 16
            Restore Icone16XP
         Case 32
            Restore Icone32XP
         Case 48
            Restore Icone48XP
      EndSelect
      
      For n=1 To 62
         Read lecture.b
         ;UseFile(0)
         WriteByte(0,lecture)
      Next
      
      ; On enregistre l'image
      ;UseFile(0)
      For n=Taille-1 To 0 Step -1
         For nn=0 To Taille-1
            ; Composante bleu de la couleur
            Couleur.l=Blue(ImageN(nn,n))
            If Couleur>127
               Bleu.b=Couleur-256
            Else
               Bleu=Couleur
            EndIf
            WriteByte(0,Bleu)
            ; Composante vert de la couleur
            Couleur.l=Green(ImageN(nn,n))
            If Couleur>127
               Vert.b=Couleur-256
            Else
               Vert=Couleur
            EndIf
            WriteByte(0,Vert)
            ; Composante rouge de la couleur
            Couleur.l=Red(ImageN(nn,n))
            If Couleur>127
               Rouge.b=Couleur-256
            Else
               Rouge=Couleur
            EndIf
            WriteByte(0,Rouge)
            
            ; Niveau de transparence de la couleur
            ; 0 = transparent
            ; 255 = opaque
            Couleur=Masque(nn,n)
            If Couleur>127
               Masque.b=Couleur-256
            Else
               Masque=Couleur
            EndIf
            WriteByte(0,Masque)
            
         Next
      Next
      
      ; Ecriture du masque classique
      ;UseFile(0)
      Cpt=0
      MasqueBinaire.b=0
      For n=Taille-1 To 0 Step -1
         For nn=0 To Taille-1
            Cpt+1
            ; le masque est en binaire, un 1 signifie que le point est transparent
            If Masque(nn,n)=0
               Select Cpt
                  Case 1
                     MasqueBinaire=MasqueBinaire+%10000000
                  Case 2
                     MasqueBinaire=MasqueBinaire+%01000000
                  Case 3
                     MasqueBinaire=MasqueBinaire+%00100000
                  Case 4
                     MasqueBinaire=MasqueBinaire+%00010000
                  Case 5
                     MasqueBinaire=MasqueBinaire+%00001000
                  Case 6
                     MasqueBinaire=MasqueBinaire+%00000100
                  Case 7
                     MasqueBinaire=MasqueBinaire+%00000010
                  Case 8
                     MasqueBinaire=MasqueBinaire+%00000001
               EndSelect
            EndIf
            
            If Cpt=8
               WriteByte(0,MasqueBinaire)
               Cpt=0
               MasqueBinaire=0
            EndIf
         Next
         
         ; on complete avec les lignes vides en fonction de la taille de l'icône (faut pas trop chercher à comprendre, moi je trouve que c'est n'importe quoi)
         Select Taille
            Case 16
               If n/2=Int(n/2) ; une ligne sur 2
                  For i=1 To 2
                     WriteByte(0,0)
                  Next
               EndIf
            Case 16
               ; pas de ligne vide
            Case 48
               If n/3=Int(n/3) ; une ligne sur 3
                  For i=1 To 2
                     WriteByte(0,0)
                  Next
               EndIf
         EndSelect
         
      Next
      
      
      
      CloseFile(0)
   EndIf
EndProcedure

DataSection
   Icone16VC :
   Data.b 0,0,1,0,1,0,16,16,0,0,1,0,24,0,104,3,0,0,22,0,0,0,40,0,0,0,16,0,0,0,32,0,0,0,1,0,24,0,0,0,0,0,64,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   Icone32VC :
   Data.b 0,0,1,0,1,0,32,32,0,0,1,0,24,0,-88,12,0,0,22,0,0,0,40,0,0,0,32,0,0,0,64,0,0,0,1,0,24,0,0,0,0,0,-128,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   Icone48VC :
   Data.b 0,0,1,0,1,0,48,48,0,0,1,0,24,0,-88,28,0,0,22,0,0,0,40,0,0,0,48,0,0,0,96,0,0,0,1,0,24,0,0,0,0,0,-128,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   Icone16XP :
   Data.b 0,0,1,0,1,0,16,16,0,0,1,0,32,0,104,4,0,0,22,0,0,0,40,0,0,0,16,0,0,0,32,0,0,0,1,0,32,0,0,0,0,0,64,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   Icone32XP :
   Data.b 0,0,1,0,1,0,32,32,0,0,1,0,32,0,-88,16,0,0,22,0,0,0,40,0,0,0,32,0,0,0,64,0,0,0,1,0,32,0,0,0,0,0,-128,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
   Icone48XP :
   Data.b 0,0,1,0,1,0,48,48,0,0,1,0,32,0,-88,37,0,0,22,0,0,0,40,0,0,0,48,0,0,0,96,0,0,0,1,0,32,0,0,0,0,0,-128,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EndDataSection
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour
un petit soucis, je met une image couleur 48x48
avec son masque et elle devient un icône en noir et blanc
pourtant dans la boite de dialogue j'ai deux carre noir
une image couleur et une autre en noir et blanc, mais
après la conversion, j'ai une icône monochrome pour le format XP
peut être une astuce que je n'ai pas comprise ???
mais au format vista c'est bon voila!
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Vas voir sur le site du Soldat Inconnu http://www.lsi-dev.com/index.php et cherche un programme qui s'appelle Encode en Icône. C'est son programme que j'utilise depuis un bon moment déjà.

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

La dernière version supporte les PNG en plus des BMP.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre