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

AWT/Swing Java Discussion :

Fond d'image blanc


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut Fond d'image blanc
    Bonjour,

    C'est certainement tout bête, mais je voudrais créer une image avec un fond blanc et je n'y arrive pas.

    Pour construire mon image, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BufferedImage result;
    result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    A partir de là, je trace sur l'image le contenu d'un panel et d'une JInternalFrame comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    g2d = (Graphics2D) result.createGraphics();
    panel.printAll(g2d);
     
    g2d.translate(0, panel.getSize().height);
    componentToDraw.printAll(g2d);
    Le problème c'est que le panel ne fait pas la même largeur que le composant à tracer. Du coup, au bout du panel, j'ai une bande de pixels noirs. J'aimerai que ces pixels soient blancs!

    J'ai essayé de rajouter du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g2d.setBackground(Color.WHITE);
    g2d.setColor(Color.WHITE);
    avant le tracé du panel (juste après la création du Graphics), mais ça ne marche pas.

    Quelqu'un aurait une idée? (avant que je ne me lance dans l'essai de tous les types d'images...)
    Merci d'avance!

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Bon ben pour l'instant je remplis mon image de pixels blancs avant de peindre les composants à représenter, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       // on peint en blanc
       for (int i=0; i<width; i++) {
          for (int j=0; j<height; j++) {
             result.setRGB(i, j, 0xffffffff);
          }
       }
    Mais j'imagine qu'il doit exister un truc tout bête pour créer une image blanche à l'origine, non?

  3. #3
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    J'ai l'impression que tu mélanges un peu tout

    graphics.setColor et setBackground permettent de modifier la couleur pour les impressions futures dans le graphics.

    Il faut faire quelquechose du genre, sur le contexte graphique de ton image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, ... taille de ton image ...);
    Puis tu changes encore la couleur si tu veux dessiner quelque chose sur le fond blanc. Et ainsi de suite.

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je viens d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g2d.clearRect(0,0,width,height);
    qui justement remplit le rectangle donné avec la backgroundColor.

    Mais je pensais qu'il y avait un moyen direct de créer une image blanche.
    C'est pas grave, problème résolu d'une autre manière

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Globalement il est plus intéressant de passer directement par la BufferedImage que par des Graphics. Pour dessiner un Rectangle sans passer par des Graphics, l'idéal serait d'utiliser le Raster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result.getRaster().setPixels(0, 0, width, height, new int[]{0, 0, 0});
    Si je ne me trompe pas, c'est plus rapide.

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par xavlours
    Globalement il est plus intéressant de passer directement par la BufferedImage que par des Graphics. Pour dessiner un Rectangle sans passer par des Graphics, l'idéal serait d'utiliser le Raster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result.getRaster().setPixels(0, 0, width, height, new int[]{0, 0, 0});
    Si je ne me trompe pas, c'est plus rapide.
    C'est peut-être plus rapide, mais ça plante
    java.lang.ArrayIndexOutOfBoundsException: 3
    at java.awt.image.SinglePixelPackedSampleModel.setPixels(Unknown Source)
    at java.awt.image.WritableRaster.setPixels(Unknown Source)
    at sun.awt.image.SunWritableRaster.setPixels(Unknown Source)
    Extrait de la JavaDoc :
    [FONT=Courier New]setPixels[/FONT][FONT=Courier New](int x, int y, int w, int h, int[] iArray)[/FONT]
    Sets all samples for a rectangle of pixels from an int array containing one sample per array element.
    Il faut peut-être créer un tableau contenant width*height éléments?
    Je vais tester...

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Si ca plante, c'est que ton image n'est pas de type INT_RGB (qui demande 1 seule valeur dans le tableau, d'ailleurs j'en mettais trop), mais peut-être 4BYTES_ARGB qui demande un tableau de 4 valeurs (normal).
    Sinon, tu peux utiliser la méthode getNumBands pour savoir combien de valeurs mettre dans le tableau.

    [EDIT] Voir aussi à utiliser getMinX/Y getWidth getHeight du Raster plutôt que des valeurs en dur, on sait jamais.

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par xavlours
    Si ca plante, c'est que ton image n'est pas de type INT_RGB
    Je la crée comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    g2d = (Graphics2D) result.createGraphics();
    Ca m'embêterai un peu qu'elle ne soit pas de TYPE_INT_RGB

    Par contre, c'est juste une image vierge, après, je vais tracer les composants à sauvegarder dessus à l'aide de la méthode printAll(g2d).
    C'est peut-être la source du crash?

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bon, ok sur ce coup là je me suis lamentablement vautré. Pour appeler setPixels, le tableau doit contenir (width * height * getNumBands) éléments, c'est à dire de quoi définir chaque pixel séparément.
    Je croyais avoir appelé setPixels dans un projet, mais j'appelais setPixel, donc là le tableau ne contient que getNumBands éléments.

    Pour affecter le rectangle complet, il faut donc soit affecter chaque pixel séparément, soit allouer un tableau d'entiers de taille suffisante pour faire un (ou plusieurs) appels à setRGB de BufferedImage ou setPixels de WritableRaster.

    Le message principal, c'est que ces deux méthodes sont au moins aussi rapides que Graphics.fillRect (quand on a une BufferedImage, c'est dommage de ne pas en profiter).

    Je m'endormirai moins c.n ce soir. Désolé pour le dérangement.

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par xavlours
    Je m'endormirai moins c.n ce soir. Désolé pour le dérangement.
    J'appelle pas ça du dérangement : j'appelle ça de l'échange de bons procédés.

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

Discussions similaires

  1. setBackground(); Probleme de fond d'image !
    Par 19cmos83 dans le forum Applets
    Réponses: 2
    Dernier message: 03/07/2007, 09h11
  2. image de fond css / image dans code html
    Par rastali dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 20/02/2007, 08h54
  3. Réponses: 6
    Dernier message: 28/02/2006, 21h21
  4. JFrame ayant pour fond une Image (centrée ou en mosaïque)
    Par mariogarcia dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 22/12/2005, 01h01
  5. Fond d'image
    Par kase74 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/11/2005, 13h47

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