Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Affichage d'une icône | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Affichage d'une icône Ven 15 Fév 2019 - 22:47 | |
| J'ai essayé (vainement) d'afficher une icône (image format .ICO) dans un Picture, mais je n'ai pas réussi, même en la convertissant (avec une ressource externe, IrfanView par exemple) en bmp ou jpg.
Elle s'affiche, évidemment, mais sans respecter les zones de transparence. et je n'ai pas réussi à trouver où dans le fichier est la couleur de transparence. J'ai lu quelque part sur internet que c'est la couleur du 1er pixel en haut à gauche, mais ça ,ne marche pas. Je pense que ce n'est pas indiqué aussi simplement, et qu'il s'agit de masques qui s'appliquent à toutes les couleurs de l'image.
Heureusement, j'ai fini par utiliser la fonction "LoadAnyImageFile" de KGF.dll (merci encore une fois Klaus) qui copie l'image dans le presse-papier, et il suffit alors de faire un Clipboard_Paste dans le Picture, et l'icône apparaît avec ses zones de transparence qui sont respectées.
Ce qui permet d'afficher une véritable icône dans un programme Panoramic. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Affichage d'une icône Ven 15 Fév 2019 - 23:06 | |
| Merci, JL35 ! La transparence dans une icône est une affaire très complexe, et ce n'est pas juste 1 seul pixel qui détermine la couleur de transparence. Voici un extrait de la doc (pardon, c'est en anglais...): - Citation :
- Icon resource structure
An ICO or CUR file is made up of an ICONDIR ("Icon directory") structure, containing an ICONDIRENTRY structure for each image in the file, followed by a contiguous block of all image bitmap data (which may be in either Windows BMP format, excluding the BITMAPFILEHEADER structure, or in PNG format, stored in its entirety).[3]
Images with less than 32 bits of color depth follow a particular format: the image is encoded as a single image consisting of a color mask (the "XOR mask") together with an opacity mask (the "AND mask").[6][not in citation given] The XOR mask must precede the AND mask inside the bitmap data; if the image is stored in bottom-up order (which it most likely is), the XOR mask would be drawn below the AND mask. The AND mask is 1 bit per pixel, regardless of the color depth specified by the BMP header, and specifies which pixels are fully transparent and which are fully opaque. The XOR mask conforms to the bit depth specified in the BMP header and specifies the numerical color or palette value for each pixel. Together, the AND mask and XOR mask make for a non-transparent image representing an image with 1-bit transparency; they also allow for inversion of the background. The height for the image in the ICONDIRENTRY structure of the ICO/CUR file takes on that of the intended image dimensions (after the masks are composited), whereas the height in the BMP header takes on that of the two mask images combined (before they are composited). Therefore, the masks must each be of the same dimensions, and the height specified in the BMP header must be exactly twice the height specified in the ICONDIRENTRY structure.[citation needed]
32-bit images (including 32-bit BITMAPINFOHEADER-format BMP images[Notes 1]) are specifically a 24-bit image with the addition of an 8-bit channel for alpha compositing. Thus, in 32-bit images, the AND mask is not required, but recommended for consideration. Windows XP and higher will use a 32-bit image in less than True color mode by constructing an AND mask based on the alpha channel (if one does not reside with the image already) if no 24-bit version of the image is supplied in the ICO/CUR file. However, earlier versions of Windows interpret all pixels with 100% opacity unless an AND mask is supplied with the image. Supplying a custom AND mask will also allow for tweaking and hinting by the icon author. Even if the AND mask is not supplied, if the image is in Windows BMP format, the BMP header must still specify a doubled height. | |
| | | Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Affichage d'une icône. Sam 16 Fév 2019 - 9:46 | |
| Bonjour. Et voici la traduction en français, réalisée avec Deepl. - Code:
-
Un fichier ICO ou CUR est constitué d'une structure ICONDIR ("répertoire d'icônes"), contenant une structure ICONDIRENTRY pour chaque image du fichier, suivie d'un bloc contigu de toutes les données image bitmap (qui peuvent être au format Windows BMP, à l'exclusion de la structure BITMAPFILEHEADER, ou au format PNG, entièrement stockées[3].]
Les images avec moins de 32 bits de profondeur de couleur suivent un format particulier : l'image est codée comme une image unique composée d'un masque de couleur (le "masque XOR") et d'un masque d'opacité (le "masque AND")[6][pas en citation donnée] Le masque XOR doit précéder le masque AND dans les données bitmap ; si l'image est enregistrée dans un ordre ascendant (qui est très probablement), le masque XOR sera dessiné sous le masque AND. Le masque ET est de 1 bit par pixel, quelle que soit la profondeur de couleur spécifiée par l'en-tête BMP, et spécifie quels pixels sont totalement transparents et lesquels sont totalement opaques. Le masque XOR est conforme à la profondeur de bits spécifiée dans l'en-tête BMP et spécifie la couleur numérique ou la valeur de palette pour chaque pixel. Ensemble, le masque ET et le masque XOR forment une image non transparente représentant une image avec une transparence de 1 bit ; ils permettent également l'inversion de l'arrière-plan. La hauteur de l'image dans la structure ICONDIRENTRY du fichier ICONDIRENTRY du fichier ICO/CUR prend celle des dimensions d'image prévues (après la composition des masques), tandis que la hauteur dans l'en-tête BMP prend celle des deux images de masque combinées (avant la composition). Par conséquent, les masques doivent avoir les mêmes dimensions et la hauteur spécifiée dans l'en-tête BMP doit être exactement le double de la hauteur spécifiée dans la structure ICONDIRENTRY[citation nécessaire].
Les images 32 bits (y compris les images BMP au format BITMAPINFOHEADER de 32 bits[Notes 1]) sont spécifiquement une image 24 bits avec l'ajout d'un canal 8 bits pour le compositing alpha. Ainsi, dans les images 32 bits, le masque ET n'est pas nécessaire, mais il est recommandé de le prendre en compte. Windows XP et supérieur utilisera une image 32 bits en mode couleurs inférieures à la couleur réelle en construisant un masque ET basé sur le canal alpha (si on ne réside pas déjà avec l'image) si aucune version 24 bits de l'image n'est fournie dans le fichier ICO/CUR. Cependant, les versions antérieures de Windows interprètent tous les pixels avec une opacité de 100 % à moins qu'un masque ET ne soit fourni avec l'image. La fourniture d'un masque ET personnalisé permettra également à l'auteur de l'icône d'apporter des modifications et de faire des allusions. Même si le masque ET n'est pas fourni, si l'image est au format Windows BMP, l'en-tête BMP doit toujours spécifier une hauteur doublée. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Affichage d'une icône Sam 16 Fév 2019 - 10:27 | |
| Merci mes amis pour ces explications, Klaus pour l'original et Pedro pour la traduction. (Un bravo particulier pour Pedro, pour la traduction, qui est très fluide et de lecture agréable, pour la forme en tout cas !). Je me doutais bien que ce n'étais pas aussi simple (mais pas que c'était aussi compliqué !). J'ai retrouvé dans mes archives une sub que j'avais faite pour faire un dump d'un fichier ico, et on voit bien que les couleurs des pixels sont gérées par des zones bitmap AND et XOR. Donc bien trop compliqué pour l'usage que je veux en faire (simplement l'affichage), et grâce à KGF.dll mon problème est résolu. Voici la sub, si ça peut intéresser quelqu'un: - Code:
-
DIM fi$ fi$ = "C:\GRAPH\ICONES\32x32\Animaux\Animal_02.ico" HEIGHT 0,1000 LIST 1: FULL_SPACE 1 Dumpico(fi$,1) END '==================================== SUB Dumpico(fi$,ls%) ' Dump d'un fichier fi$ .ICO, affichage dans le LIST ls% IF LABEL("Dp") = 0 THEN LABEL Dp DIM_LOCAL sz%,wi%,hi%,nc%,ad%,aa%,lg%,ll%,a$,i%,j% FILEBIN_OPEN_READ 1,fi$: sz% = FILEBIN_SIZE(1): message str$(sz%) DIM_LOCAL v%(2*sz%) FILEBIN_BLOCK_READ 1,sz%,v%(0) FILEBIN_CLOSE 1 IF v%(4) > 1 THEN EXIT_SUB: ' plus d'une icône, abandon wi% = v%(6): hi% = v%(7): nc% = v%(8): ' largeur, hauteur, nb de couleurs IF nc% = 0 THEN nc% = 256 ITEM_ADD ls%,"***** "+fi$+" "+STR$(wi%)+"x"+STR$(hi%)+" "+STR$(sz%)+" octets." ad% = 0: lg% = 6: GOSUB Dp ITEM_ADD ls%," - Entries: -" ad% = 6: lg% = 16: GOSUB Dp ITEM_ADD ls%," - InfoHeader: -" ad% = 22: lg% = 40: GOSUB Dp ITEM_ADD ls%," - Colors: -" ad% = 62: lg% = nc%*4: GOSUB Dp ITEM_ADD ls%," - XOR Bitmap: -" ad% = ad%+lg%: lg% = nc%*4: GOSUB Dp ITEM_ADD ls%," - AND Bitmap: -" ad% = ad%+lg%: lg% = wi%*hi%: GOSUB Dp ITEM_ADD ls%," - Reste (?): -" ad% = ad%+lg%: lg% = sz%-ad%: GOSUB Dp EXIT_SUB Dp: aa% = ad%: ll% = lg% IF lg%>16 FOR j% = 1 TO INT(lg%/16) a$ = HEX$(ad%): a$ = RIGHT$("000"+HEX$(ad%),4)+":" FOR i% = ad% TO ad%+15 a$ = a$+" "+RIGHT$("0"+HEX$(v%(i%)),2) NEXT i% ITEM_ADD ls%,a$ ad% = ad%+16 NEXT j% lg% = lg%-16*INT(lg%/16) END_IF a$ = HEX$(ad%): a$ = RIGHT$("000"+HEX$(ad%),4)+":" FOR i% = ad% TO ad%+lg%-1 a$ = a$+" "+RIGHT$("0"+HEX$(v%(i%)),2) NEXT i% ITEM_ADD ls%,a$ ad% = aa%: lg% = ll%: ' restore RETURN END_SUB ce qui donne (le début): | |
| | | Contenu sponsorisé
| Sujet: Re: Affichage d'une icône | |
| |
| | | | Affichage d'une icône | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |