Page 1 sur 1

Image To Icon

Publié : ven. 11/mars/2016 17:45
par falsam
ImageToIcon est un un petit utilitaire pour convertir une image en Icone.

Image

Le principe.
- Charger une image au format BMP, JPEG ou PNG.
- Définir la taille de l'icone.
- Sauvegarder l'icone dans le même dossier que l'image d'origine.

Download.
Le projet est hébergé sur la plateforme collaborative GitHub
:arrow: https://github.com/falsam/ImageToIcon

20-12-2022 - Mise à jour. ButtonImageGadgetNoSkin() est remplacé par ButtonImageGadget()

Re: Image To Icon

Publié : sam. 12/mars/2016 18:35
par falsam
Mise à jour du code
- BugFix : Amélioration de l'icone.
- Remove : Zoom + et Zoom -
- Add : Icone de prévisualisation de l'icone dans la fenêtre de l'utilitaire.

■ Projet sur GitHub
:arrow: https://github.com/falsam/ImageToIcon

■ Download direct
:arrow: https://github.com/falsam/ImageToIcon/a ... master.zip

Re: Image To Icone

Publié : sam. 12/mars/2016 22:38
par Patrick88
bin en fait, je fait mes icones avec "l'outil capture d'écran" et "le paint" de windows... en sauvegarde en bmp ou png suivant le logiciel de destination.... plus simple que les usines à gaz "dédié" comme tu dis.

je vais donc ajouter ton petit toutils dans mon dossier "dessin",

[/kcc on] merci-milles bizou-etc

options bmp en ico ? m'sieur catbury (tm) siouplait.[/kcc off]

pat

Re: Image To Icon

Publié : sam. 12/mars/2016 23:41
par falsam
falsam a écrit :options bmp en ico ?
Voila qui est fait. Pourquoi ai je oublié ce format d'image? je ne sais pas.

Suite à quelques observations sur FreeChat j'ai adapté (en principe) avec l'aide de Gally la taille de la police de caractère en fonction des paramètres d'affichage de Windows.

Cette adaptation n'est pas utile sous Windows 10 mais est essentielle sous Windows 7.

Etant sous Windows 10 je n'ai pas pu faire des tests d'affichage. J’espère que certains d'entres vous ayant modifiés la taille d'affichage de la police à 125% par exemple pourront faire tester ce code et me dire si l'affichage est conforme au ScreenShoot du premier message.

Merci à Gally pour le code et les tests qui ont suivis, merci aussi à Studing pour les tests et aussi à G-Rom pour l'amélioration visuel de l'icone créée.
le code de gally se trouve dans la procédure AjustFontSize()
:arrow: https://github.com/falsam/ImageToIcon/b ... on.pb#L122

■ Projet sur GitHub
:arrow: https://github.com/falsam/ImageToIcon

■ Download direct
:arrow: https://github.com/falsam/ImageToIcon/a ... master.zip

Re: Image To Icon

Publié : dim. 13/mars/2016 12:14
par Anonyme2
Voici du code pour créer une icône compressée à partir d'un png puique le principe de microsoft est d'avoir l'entête de l'icône suivi par la png en entier.

Le code fonctionne pour des png en RVB + alpha, j'ai pas cherché pour les autres formats, c'est juste les valeurs de l'en-tête à modifier, ces données se trouvent dans le chunk IHDR du png juste après les dimensions.

ici pour les explication en anglais
http://libpng.org/pub/png/spec/1.2/PNG-Chunks.html

Le code charge le fichier png (256x256) ces valeurs peuvent être modifiées dans le code.
Je teste certaines valeurs, je crée l'entête du fichier ico suivi du png.

J'ai mis la procédure de conversion Reverse_endian_format et une copie avec 3 lignes en asm pour faire la même chose.
Le code qui suit utilise celle qui n'a pas d'assembleur, celle en assembleur, je l'utilise depuis des années avec PureIconManger sans avoir eu de soucis. Faites comme bon vous semble :D

Cest juste pour que Falsam puisse ajouter la compression, mais je répète, pour des formats d'images par exemple 16 couleurs, je ne sais pas ce que ça donne.

Après, en utilisant une image en 32 bits et en copiant celle à 16 couleurs, cela devrait fonctionner tout en sachant que le png sera plus grand.

Code : Tout sélectionner

;// signature du png compressé pour icone Vista
#Compression_Segment_IHDR = $A1A0A0D474E5089

;// identifiant fichiers
#Fichier_Png = 100
#Fichier_Ico = 101

;- Structures IconDirEntry
;// les structures IconDirEntry et IconDir sont utilisées pour stocker les icônes en fichier .ico
Structure IconDirEntry
      ;// largeur de l'icône en pixels
      bWidth.a
      ;// hauteur de l'icône en pixels (x 2)
      bHeight.a
      ;// Ce champ permet d'indiquer le nombre de couleurs que prend en charge l'icône: 2, 4, 8 ou 16. Si la valeur est 0, il s'agit d'une icône de 256 couleurs ou plus.
      bColorCount.a ; nombre de couleurs de l'icône (0 si >=8bpp)
      ;// Ce champ est réservé, et il doit toujours contenir la valeur 0.
      bReserved.a
      ;// Ce champ permet d'indiquer le nombre de plages de couleurs que contient l'icône. (Color Planes)
      wPlanes.u
      ;// Ce champ permet d'indiquer le nombre de bits par pixel que contient l'icône. (Bits per pixel)
      wBitCount.u
      ;// Taille en octets de l'icône
      dwBytesInRes.l
      ;// Ce champ permet d'indiquer la position de déplacement (Offset), en octets, du début du fichiers jusqu'à l'icône.
      dwImageOffset.l
EndStructure
;- Structures IconDir
Structure IconDir
      idReserved.u ; réservé, toujours à 0
      idType.u ; resource type, à 1 pour les icônes
      idCount.u ; nombre d'image dans le fichier icônes
      idEntries.IconDirEntry[1] ; l'entrée de chaque image
EndStructure

Procedure.i Reverse_endian_format(valeur)
      ;// /////////////////////////////////////////////////////////////////////////////////////////////////
      ;//
      ;//  FONCTION: Reverse_endian_format()
      ;//
      ;//  BUT:  inverser les octets (inverse les formats little/big endian)
      ;//
      ;//  PARAMS: valeur - la valeur à convertir
      ;//
      ;//  RETOURNE: un long qui est la valeur convertie
      ;//
      ;// /////////////////////////////////////////////////////////////////////////////////////////////////
      ProcedureReturn ((valeur & $FF)<<24) | ((valeur & $FF00)<<8) | ((valeur & $FF0000)>>8) | ((valeur & $FF000000)>>24)
EndProcedure

Procedure.i Reverse_endian_format_Fast(valeur)
      ;// /////////////////////////////////////////////////////////////////////////////////////////////////
      ;//
      ;//  FONCTION: Reverse_endian_format()
      ;//
      ;//  BUT:  inverser les octets (inverse les formats little/big endian)
      ;//
      ;//  PARAMS: valeur - la valeur à convertir
      ;//
      ;//  RETOURNE: un long qui est la valeur convertie
      ;//
      ;// /////////////////////////////////////////////////////////////////////////////////////////////////
      ;//  c'est équivalent à l'instruction asm BSWAP dont le code asm est le suivant
      ;//  supprimer le point virgule devant les instrustions asm et mettez un point virgule
      ;//  devant la ligne ProcedureReturn, ç'est optimisé de cette façon
      ;//  exemple : $12345678 devient $78563412
      EnableASM
            CompilerSelect #PB_Compiler_Processor
                  CompilerCase #PB_Processor_x86
                        ! MOV    eax, dword [p.v_valeur]
                        ! BSWAP  eax
                        ProcedureReturn
                        
                  CompilerCase #PB_Processor_x64
                        ! MOV    rax, qword [p.v_valeur]
                        ! BSWAP  eax
                        ProcedureReturn
            CompilerEndSelect
      DisableASM
      ; ProcedureReturn ((valeur & $FF)<<24) | ((valeur & $FF00)<<8) | ((valeur & $FF0000)>>8) | ((valeur & $FF000000)>>24)
EndProcedure

Procedure SavePngToICO_C(PngFile$)
      ;// *********************************************************
      ;// PngFile$ avec chemin complet
      ;//
      ;// Retoune #True en cas de succès, sinon -1
      ;//
      ;// Le fichier ico est créé dans le même dossier que le png
      ;//
      ;// *********************************************************
      
      ;// adresse du fichier png en mémoire
      Protected *MemoryAdd
      ;// mémorise la taille du fichier
      Protected Filesize_q.q
      ;// variable d'écriture des ico
      Protected ico.IconDir
      ;// fichier ico
      Protected FichierIco$ = ""
      
      
      Filesize_q = FileSize(PngFile$)
      If Filesize_q < 0
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// Teste si fichier Png
      If LCase(GetExtensionPart(PngFile$)) <> "png"
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// allocation mémoire pour le fichier
      *MemoryAdd = AllocateMemory(Filesize_q)
      If *MemoryAdd = 0
            ProcedureReturn -1  ; erreur
      EndIf
      
      If ReadFile(#Fichier_Png, PngFile$) = #Null
            FreeMemory(*MemoryAdd)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// lecture et écriture du fichier en mémoire
      If ReadData(#Fichier_Png, *MemoryAdd, Filesize_q) <> Filesize_q
            FreeMemory(*MemoryAdd)
            CloseFile(#Fichier_Png)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// teste les valeurs du PNG
      Select PeekQ(*MemoryAdd)
            Case #Compression_Segment_IHDR
                  ;// c'est un png
            Default
                  FreeMemory(*MemoryAdd)
                  CloseFile(#Fichier_Png)
                  ProcedureReturn -1  ; erreur
      EndSelect
      
      ;// on retrouve les dimensions depuis le segment IHDR de l'image PNG
      ;// 8 octets de signature PNG compressé
      ;// 4 octets donnant la longueur du segment qui suit qui est IHDR
      ;// 4 octets codant les lettres du segment IHDR 'IHDR'
      ;// 4 octets donnant la largeur de l'image
      ;// 4 octets donnant la hauteur de l'image
      largeur = Reverse_endian_format(PeekL(*MemoryAdd + 8 + 4 + 4))
      hauteur = Reverse_endian_format(PeekL(*MemoryAdd + 8 + 4 + 4 + 4))
      
      If (largeur <> 256 ) Or (hauteur <> 256)
            FreeMemory(*MemoryAdd)
            CloseFile(#Fichier_Png)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// création de l'icône
      ;// Le début de la Structure IconDir
      ico\idReserved = 0  ; toujours à 0
      ico\idType= 1       ; 1 --> ico
      ico\idCount= 1      ; 1 seule icône
      ;// la structure IconDirEntry de la structure IconDir
      ico\idEntries[0]\bWidth = 0
      ico\idEntries[0]\bHeight = 0
      ico\idEntries[0]\bColorCount = 0
      ico\idEntries[0]\bReserved = 0
      ico\idEntries[0]\wPlanes= 1
      ico\idEntries[0]\wBitCount= 32
      ico\idEntries[0]\dwBytesInRes= Filesize_q
      ico\idEntries[0]\dwImageOffset= 22
      
      ;// le nom du fichier ico
      FichierIco$ = GetPathPart(PngFile$) + StringField(GetFilePart(PngFile$), 1, ".") + ".ico"
      
      ;// création du fichier ico, aucun test si fichier existe déjà
      If CreateFile(#Fichier_Ico, FichierIco$) = 0
            FreeMemory(*MemoryAdd)
            CloseFile(#Fichier_Png)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// écriture des données de l'en-tête
      If WriteData(#Fichier_Ico, @ico, SizeOf(IconDir)) <> SizeOf(IconDir)
            FreeMemory(*MemoryAdd)
            CloseFile(#Fichier_Ico)
            CloseFile(#Fichier_Png)
            DeleteFile(FichierIco$)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// écriture du fichier png
      If WriteData(#Fichier_Ico, *MemoryAdd, MemorySize(*MemoryAdd)) <> MemorySize(*MemoryAdd)
            FreeMemory(*MemoryAdd)
            CloseFile(#Fichier_Ico)
            CloseFile(#Fichier_Png)
            DeleteFile(FichierIco$)
            ProcedureReturn -1  ; erreur
      EndIf
      
      ;// termine
      FreeMemory(*MemoryAdd)
      CloseFile(#Fichier_Ico)
      CloseFile(#Fichier_Png)
      
      ProcedureReturn #True
EndProcedure

SavePngToICO_C("G:\Icones\Png\wyvern-jabba-the-tux.png")

Re: Image To Icon

Publié : dim. 13/mars/2016 14:50
par Patrick88
merci,

Pat

Re: Image To Icon

Publié : lun. 14/mars/2016 12:07
par Kwai chang caine
Merci à vous deux 8)

Re: Image To Icon

Publié : mar. 20/déc./2022 13:00
par falsam
Mise à jour : ButtonImageGadgetNoSkin() est remplacé par ButtonImageGadget()

Github https://github.com/falsam/ImageToIcon
Download https://github.com/falsam/ImageToIcon/a ... master.zip

Re: Image To Icon

Publié : mar. 20/déc./2022 21:33
par SPH
GRAND merci Falsam, ça marche. 😎

Re: Image To Icon

Publié : sam. 31/déc./2022 6:31
par SPH
Bon, je rencontre un problème que je ne m'explique pas. L'aperçu est bon (le fond est bien transparent).
Mais quand je sauvegarde, le fond est vert clair... :(

Où est l'erreur ? :?:

Re: Image To Icon

Publié : sam. 31/déc./2022 7:03
par falsam
Possibilité d'avoir ton image d'origine pour faire un test ?

Re: Image To Icon

Publié : sam. 31/déc./2022 7:36
par SPH
falsam a écrit : sam. 31/déc./2022 7:03 Possibilité d'avoir ton image d'origine pour faire un test ?
Image

Image

Les .ICO générés ne sont pas transparents. Je les veux en 128/128 (même taille que ceux ci-dessus)

Merci 😅

Re: Image To Icon

Publié : lun. 02/janv./2023 11:20
par falsam
SPH a écrit : sam. 31/déc./2022 6:31 Bon, je rencontre un problème que je ne m'explique pas. L'aperçu est bon (le fond est bien transparent).
Mais quand je sauvegarde, le fond est vert clair...
Je ne sais pas quoi te répondre car je ne rencontre pas le souci que tu mentionnes.

ton image générée en ico a bien un fond transparent.

:arrow: Download : https://falsam.com/Download/purebasic/vmur.ico

Re: Image To Icon

Publié : lun. 02/janv./2023 11:37
par SPH
Curieux !
Alors, c'est peut être mon lecteur d'images qui le rend mal (photofiltre 6)...

😶

Re: Image To Icon

Publié : mar. 03/janv./2023 10:50
par SPH
Merci Falsam pour ton lien vers le fichier ICO 😊