IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Discussion :

Comment afficher une image sur un bouton


Sujet :

Interfaces Graphiques

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 18
    Points
    18
    Par défaut Comment afficher une image sur un bouton
    Bonjour,

    Comment peut-on créer un bouton avec une image à l'intérieur ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Il faut utiliser la propriété CDATA du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    figure
    X=rand(50,50,3);
    uicontrol('style','pushbutton','cdata',X);
    L'image doit être une image True Color (RGB) dont les valeurs sont comprises entre 0 et 1 (et non pas entre 0 et 255). IMREAD est très utile pour lire les formats standards (jpeg,tiff,bmp,gif,png...)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 18
    Points
    18
    Par défaut
    C'est bon ça marche !! Cependant je vois que Matlab ne gère pas la transparence. Mon bouton est au format .png, cependant l'arrière plan de mon image (qui devrait être transparent) apparaît blanc. Est-ce que je peux faire que mon image reste bien transparence pour ne pas voir la différence avec le bouton (ou alors mettre la couleur d'arrière plan de mon image de la même couleur que le bouton ) ?

    J'avais utilisé le GUIDE pour faire ma petite interface donc j'ai légèrement changer le code que j'ai placé dans opening function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IMG = imread('E:\monPath\helpMain.png');
    set(handles.MyFirstButton, 'cdata', IMG);
    D'autre part, est-ce que je peux placer mon image à un endroit précis dans le bouton ? Par exemple, mettre mon image à gauche et un string à droite ?

    Merci encore !

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Il faut utiliser la composante alpha de l'image.
    Essaies ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [img,map,alph]= imread('E:\monPath\helpMain.png');
    col=get(0,'factoryUicontrolBackgroundColor');
    img(:,:,1)=img(:,:,1).*alph+col(1)*(~alph);
    img(:,:,2)=img(:,:,2).*alph+col(2)*(~alph);
    img(:,:,3)=img(:,:,3).*alph+col(3)*(~alph);
    set(handles.MyFirstButton, 'cdata', img);
    Pour décentrer l'image, c'est plus compliqué... par exemple pour décaler l'image vers la gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col=get(0,'factoryUicontrolBackgroundColor');
    c=reshape(col,1,1,[]);
    c=repmat(c,50,50);
    X=[rand(50,50,3) c];
     
    figure
    uicontrol('style','pushbutton','cdata',X);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai donc essayé le code donné ci-dessus, en ce qui concerne la transparence de l'image ça me met une erreur :
    Error while attempting to activate figure.
    Error using ==> plus
    Integers can only be conbined with integers of the same class, or scalar doubles.
    Pour le décalage à gauche voici mon bouton :

    Donc je ne sais pas trop pourquoi ça ne fonctionne pas. J'aimerai aussi comprendre en détail le code, surtout le code pour le décalage, voici ce que j'ai compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    % on met les valeurs de la couleur dans une matrice 1-1,
    % mais le '[]' sert à quoi ?
    c = reshape(a, 1, 1, []);
    % on crée une matrix de 50-50 où toutes valeurs sont égales à c
    c = repmat(c, 50, 50);
    % là je ne sais pas !
    X = [rand(50,50,3) c];
    Merci !
    Images attachées Images attachées  

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Commençons par le plus simple (à résoudre...) le décalage à gauche.
    L'idée consiste à créer une matrice contenant l'image et un bloc de pixels, dont la couleur est celle du bouton, que l'on viendra concaténer à droite de l'image.

    Un exemple un peu plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    function imbut
     
    % Création de la figure
    figure
     
    % Ajout du bouton
    u=uicontrol('style','pushbutton',...
        'tag','bouton');
     
    % Génération d'une image
    X=rand(50,50,3);
     
    % Récupération de la couleur de fond du bouton
    col=get(u,'backgroundcolor');
     
    % Initialisation de la matrice de remplissage à droite
    padX=zeros(50,50,3);
    % Réplication la couleur col sur chaque pixels de padX
    padX(:,:,1)=col(1);
    padX(:,:,2)=col(2);
    padX(:,:,3)=col(3);
     
    % Concatènation de X et padX
    X=[X padX];
     
    % Affichage de l'image pseudo-décalée
    set(u,'cdata',X)
    Le problème ici est le choix de la taille N de la matrice de remplissage dans :Cette valeur doit être déterminée pour tous les boutons séparemment.

    Note : lire Working with Matrices à propos de la concaténation de matrices :
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Pour la transparence, les objets uicontrols ne la supporte pas.
    Il faut donc encore une fois bidouiller
    On remplace les pixels transparents par la couleur de fond de l'objet. Il devient alors difficile de gérer les transparences progressives (format png). Un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    function imbutalph
     
    % Création de la figure
    figure
     
    % Ajout du bouton
    u=uicontrol('style','pushbutton',...
        'tag','bouton');
     
    % Lecture de l'image
    [img,map,alph]=imread('??????????.png','png');
     
    % Transformer en type DOUBLE (peut etre facultatif)
    img=double(img);
    alph=double(alph);
     
    % Diviser pour obtenir des valeurs entre 0 et 1 uniquement
    img=img/255;
     
    % Seuillage des valeurs de ALPH
    seuil=255;
    alph=alph>=seuil;
     
    % Récupération de la couleur de fond du bouton
    col=get(u,'backgroundcolor');
     
    % Tous les pixels de chaque composante de IMG qui ont pour
    % valeurs correspondantes 1 dans ALPH prennent la
    % valeur correspondante de COL
    img(:,:,1)=img(:,:,1).*alph+col(1)*(~alph);
    img(:,:,2)=img(:,:,2).*alph+col(2)*(~alph);
    img(:,:,3)=img(:,:,3).*alph+col(3)*(~alph);
     
    % Affichage de l'image pseudo-transparente
    set(u, 'cdata', img);
    Avec ce code, la transparence ne sera pas très bien prise en compte. Le seuillage des valeurs de ALPH est une méthode "brutale". Il faut donc convenablement choisir la valeur de SEUIL parmis les valeurs de ALPH

    Voici une solution plus simple fonctionnant avec les images PNG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    figure
     
    u=uicontrol('style','pushbutton',...
        'units','pixels',...
        'tag','bouton',...
        'visible','off');
     
    col=get(u,'backgroundcolor');
     
    img=imread('?????????????.png','png','BackgroundColor',col);
     
    set(u,'position',[50 50 size(img,2) size(img,1)], ...
        'cdata',img, ...
        'visible','on')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 18
    Points
    18
    Par défaut
    Super ça marche, pour les deux choses ! Pour résoudre le "N" j'ai récupéré en faite la hauteur de mon image en faisant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    S = size(img);
    height = S(1,1);
    padX = zeros(height, 50, 3);
    Et j'ai aussi changé un petit truc car les valeurs retournées par "get(button,'Background')" sont comprises entre 0 et 1, du coup ça me faisait une image noire, voici le code final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    % je récupère la couleur d'arrière-plan du bouton
    col = get(handles.myButton, 'Background');
    
    % je crée mon petit icône
    img = imread('E:\monPath\icone.png', 'png', 'BackgroundColor', col);
    
    % je récupère la taille de mon image sous la forme [n,m]
    size = size(img);
    
    % je crée un rectangle initialisé à zéro de la hauteur de mon image
    % de largeur 50
    padX = zeros(size(1,1), 50, 3);
    
    % je remplis mon rectangle de la même couleur que l'arrière plan
    % CHANGEMENT ICI, je multiplie par 255 pour avoir des valeurs entre 0 et 255
    padX(:,:,1) = col(1)*255;
    padX(:,:,2) = col(2)*255;
    padX(:,:,3) = col(3)*255;
    
    % je concatène mon image et mon rectange
    newImg = [img padX];
    
    % je mets ma nouvelle image !
    set(handles.MyButton, 'cdata', newImg);
    Et voici la fenêtre finale ! Elle n'est pas très compliquée, mais je m'exerce sur des petits exemples avant de passer à des choses sérieuses !

    Merci encore pour votre aide !
    Images attachées Images attachées  

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Citation Envoyé par MilouTux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S = size(img);
    height = S(1,1);
    Ou plus simplement :
    Citation Envoyé par MilouTux
    Et j'ai aussi changé un petit truc car les valeurs retournées par "get(button,'Background')" sont comprises entre 0 et 1, du coup ça me faisait une image noire
    C'est bizarre, je croyais que seules les valeurs entre 0 et 1 étaient supportées par la propriété CDATA
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 18
    Points
    18
    Par défaut
    Oui, il me semblait avoir lu ça aussi dans l'aide de Matlab, mais bon ... Ca marche de cette manière donc tant mieux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment mettre une image sur un bouton
    Par team94 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 12/03/2014, 08h57
  2. Comment ajouter une image sur un bouton ?
    Par riesco31 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 19/12/2012, 18h57
  3. Réponses: 8
    Dernier message: 16/06/2009, 23h14
  4. comment afficher une image sur un cadre
    Par pakita dans le forum JBuilder
    Réponses: 3
    Dernier message: 30/04/2007, 15h11
  5. [JBouton] Comment mettre une image sur un bouton ?
    Par Kyti dans le forum Composants
    Réponses: 6
    Dernier message: 11/03/2005, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo