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

2D Java Discussion :

Bug graphique lors d'un dessin


Sujet :

2D Java

  1. #1
    Membre actif
    Bug graphique lors d'un dessin
    Bonjour,

    j'ai un bug graphique quand j'affiche une image noir et blanc avec par-dessus un dégradé de couleurs.

    Voici une capture d'écran avec les couleurs normales :


    Et en voici une avec des couleurs buggées


    Voici le code de la méthode qui ajoute le dégradé de couleurs à une image donnée :
    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
     
    // g : destination de dessin, i : image source sur laquelle le dégradé est appliqué, c : couleurs du dégradé, x et y : coordonnées de dessin
      public static void drawAdditionnalGradient(Graphics2D g, BufferedImage i, Color[] c, int x, int y) {
        int w = i.getWidth();
        int h = i.getHeight();
        BufferedImage b0 = DirectBufferIO.createBuffer(w, h, Transparency.TRANSLUCENT, "PaintToolkit.drawAdditionnalGradient,0"); // création des bufferq
        BufferedImage b1 = DirectBufferIO.createBuffer(w, h, Transparency.TRANSLUCENT, "PaintToolkit.drawAdditionnalGradient,1");
        Graphics2D g0 = b0.createGraphics();
        Graphics2D g1 = b1.createGraphics();
     
        int alpha = c[0].getAlpha(); //composante transparence du dégradé, donné par la composante alpha de la première couleur du dégradé
        if (alpha < 255)
          g0.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)alpha / 255f)); // dessiner en transparent sur g0
        g0.drawImage(i, 0, 0, null); // on dessine l'image i en transparent sur g0
        fillOpaqueGradient(g1, c, new Rectangle(0, 0, w, h)); // créer un dégradé de couleurs opaque dans g1
        b1.getAlphaRaster().setRect(b0.getAlphaRaster()); // la transparence de b1 devient celle de b0, on obtient un dégradé découpé et transparent
        g.drawImage(b1, x, y, null); // dessin du déradé dans la destination 
     
        g0 = null; // vidange mémoire
        g1 = null;
        DirectBufferIO.flushBuffer(b0);
        DirectBufferIO.flushBuffer(b1);
      }


    Je me demande d'où vient ce bug et comment le corriger.
    Le bug apparait sur certaines configurations et pas sur d'autres dans AnAcondA, un logiciel que je développe.
    Si vous voulez l'essayer, vous pouvez le télécharger sur : www.anadoncamille.com
    Si vous voulez voir l'animation qui a créé les deux captures d'écran, démarrez AnAcondA et allez dans Laboratoire -> Recherche -> Causalité -> Multiver
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  2. #2
    Rédacteur/Modérateur

    DirectBufferIO est une classe que tu as créée ou provient d'une bibliothèque de manipulation d'images quelconque ?
    Quel est le modèle de couleurs de chacune des deux images ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre actif
    DirectBufferIO est une classe que j'ai créée et qui crée des BufferedImage 32 bits sur le modèle ARGB, comme les images au format png.
    La classe gère aussi la mémoire associée à ces buffers et offre des méthodes pour libérer la mémoire occupée par un buffer.
    La méthode createBuffer crée un buffer avec la méthode GraphicsConfiguration.createCompatibleImage(width, height, transparency) et l"enregistre.
    La méthode flushBuffer libère la mémoire utilisée par le buffer car le garbage collector ne le fait pas correctement.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  4. #4
    Membre actif
    SOS
    Y a-t-l quelqu'un qui peut m'aider pour ce bug ?
    Je ne sais pas à qui m'adresser.
    Quelqu'un a une idée ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  5. #5
    Membre confirmé
    Je ne sais pas si c'est lié ou pas.

    https://www.developpez.net/forums/d6...-version-java/

  6. #6
    Rédacteur/Modérateur

    C'est surtout posté par la même personne... a 9 ans d’écart...
    Donc la tu es en train de lui dire que c'est le même soucis qu'il a déjà corrigé dans son outil il y a 9 ans. Pourquoi pas... mais j'ai un gros doute quand même .

    Franchement je ne sais pas, un soucis avec les pilotes, ou pourquoi pas dans les entrailles de Java2D dans les dernières maj. Est-ce que ça a été teste sur plusieurs ordi et surtout est-ce reproduisible en revenant a du Java2D plus basique (ex: sans sur-couche perso qui empêche de tester ça nous-même).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre confirmé
    Oui je me souviens très bien, et je l'avais suivi de près.
    C'est juste une piste, peut-être un param de la JVM à bouger, la release note des dernières versions et patch de JAVA à consulter.
    Je suis intéressé par la réponse, si elle existe ! Bon courage.
    Billy

  8. #8
    Expert éminent
    Bonjour,

    Citation Envoyé par anadoncamille Voir le message

    Le bug apparait sur certaines configurations et pas sur d'autres
    Avant de chercher très loin, il serait peut-être intéressant de savoir ce qui différencie les configurations qui bugguent... non?
    Ou au moins d'avoir quelques informations...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre actif
    Bonjour,

    oui effectivement c'est bien le même genre de bug que je retrouve 9 ans après le premier post. J'avais pourtant réussi à le corriger en utilisant
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    System.setProperty("sun.java2d.d3d", "false");

    Mais là, rien à faire. J'essaie de créer un raccourci avec le paramètre -Dsun.java2d.d3d=false mais la fenêtre d'exécution se referme avant que je puisse voir ce qui fait planter le raccourci. Existe-t-il un moyen pour empêcher la fenêtre d'exécution d'un raccourci .bat de se refermer toute seule sous Windows10 ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  10. #10
    Membre actif
    J'ai finalement réussi à lancer le raccourci avec le paramètre D3D mais rien n'y fait, le bug est toujours là.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  11. #11
    Membre actif
    Au secours !!

    Il n'y a rien à faire. Je crois avoir tout essayé : les différents modes de composition d'image d'AlphaComposite, la ligne de commande avec d3d, celle avec opengl, rien n'y fait. Les couleurs sont toujours aussi moches sur ma carte graphique NVidia. Je soupçonne le processeur graphique d'y être pour quelque chose mais je n'ai trouvé aucun paramètre pour y remédier.

    Quelqu'un pourrait-il m'aider ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  12. #12
    Membre actif
    Raaah !!! J'avais la solution sous le nez depuis le début ! J'ai fait l'erreur de mettre le paramètre de ligne de commande à true alors qu'il fallait simplement le mettre à false. C'est pour ça que ça ne marchait pas. Depuis j'ai relu cette discussion et la précédente et la solution est bien la même : désactiver le pipeline Direct 3D en ajoutant -Dsun.java2d.d3d=false à la ligne de commande. Par contre ça ne marche pas en essayant de désactiver le pipeline alors que le programme fonctionne.

    Merci pour votre soutien.

    Si vous voulez essayer AnAcondA, le logiciel que je développe, voici quelques liens :

    Lien vers la page d'AnAcondA : http://sylv.tournois.free.fr/guide.html

    Téléchargement d'AnAcondA : http://sylv.tournois.free.fr/stat.php

    Vidéo tutoriel d'installation et de démarrage :

    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

###raw>template_hook.ano_emploi###