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

2D Java Discussion :

Traitement d'image gourmande


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut Traitement d'image gourmande
    Bonjour,
    Mon but est de crée un sorte de calque qui gère la transparence.
    Es t'il normal que ce simple bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BufferedImage bImage = new BufferedImage(p.getScreenWidth(), p.getScreenHeight(), BufferedImage.TYPE_INT_ARGB );
    Graphics graphics = bImage.createGraphics();
    g.drawImage(Toolkit.getDefaultToolkit().createImage(bImage.getSource()), 0, 0, null);
    graphics.dispose();
    fasse monter le travail du processeur de 3 à 10% et la mémoire vive de 50 à 650 Mo?
    Sachant que ce code et exécuté 60 fois par secondes.

    Es-ce que je m'y prend mal?
    Y a t'il d'autres moyens?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, tu crées une image de la taille de l'écran, ce qui consiste à créer une zone mémoire pour stocker tous les pixels : 4 octets par pixels en ARGB, à multiplier par le nombre de pixels (largeur*hauteur de l'écran). Tu créés un tampon pour dessiner, qui consiste à réserver un peu de mémoire supplémentaire. Puis tu dupliques l'image pour la redessiner dans le tampon, ce qui consiste à au moins tripler la mémoire utilisée (le tampon reçoit le dessin de l'image, donc prend au moins la mémoire nécessaire pour). Tout ça pour rien, puisque tu crées une image totalement transparente que tu dupliques (donc tu obtiens une image totalement transparente) pour la dessiner sur elle-même (une image transparente dessinée sur une image transparente ça donne... une image transparente !!!).

    Tout ça prend du cpu évidemment, surtout à raison de 60 fois par seconde ! Ce qui ne doit pas laisser beaucoup de temps au GC pour libérer la mémoire utilisée par les images intermédaires, qui attend donc d'avoir un créneau (ou d'être obligé de le faire), d'où montée en flêche de la mémoire occupée.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    (une image transparente dessinée sur une image transparente ça donne... une image transparente !!!)


    Oui, bien sur que, là, le code ne sert à rien.
    Je vais pas m'amuser à rajouter tout le dessin que je dessine dedans, ca ne te sert a rien de voir ca.
    Ce que je veux faire comprendre c'est que je veux créé un calque sur lequel dessiner ce que je veux, qui fasse au final, la taille de l'écran.
    Et ce que je veux savoir c'est si je m'y prend bien, ou si il y a d'autres moyens moins gourmand.

    Je rigole pas méchamment, c'est juste amusant de voir qu'on arrive pas difficilement à ce comprendre tout les deux.
    Tu serai pas aspi, par hasard? (T'es pas obliger de répondre)
    Moi je suis un peut sur le début du spectre, c'est peut-être pour ça que c'est le bordel.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est de cette ligne que je voulais parler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(Toolkit.getDefaultToolkit().createImage(bImage.getSource()), 0, 0, null);
    Elle duplique une image transparente pour la dessiner sur une image transparente, ce qui ne sert strictement à rien d'autre qu'à consommer de la mémoire et du cpu.

    Si tu veux dessiner dans une image transparente, il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BufferedImage bImage = new BufferedImage(p.getScreenWidth(), p.getScreenHeight(), BufferedImage.TYPE_INT_ARGB );
    Graphics graphics = bImage.createGraphics();
     
    // et là tu dessines tout ce que tu veux
     
    graphics.dispose();
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 311
    Par défaut
    Non, sinon j'ai rein a l'écran.
    Attends je te montre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void paintComponent(Graphics g){
     
    //là je dessine sur ma feuille "g.draw()"
     
    BufferedImage bImage = new BufferedImage(p.getScreenWidth(), p.getScreenHeight(), BufferedImage.TYPE_INT_ARGB );
    Graphics2D graphics = bImage.createGraphics();
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OUT));
     
    //là je dessine sur mon calque "graphics.draw()"
     
    g.drawImage(Toolkit.getDefaultToolkit().createImage(bImage.getSource()), 0, 0, null); //là je pose mon calque sur ma feuille
    g.dispose();
     
    }
    Si j'enlève cette ligne, j'ai plus rien a l'écran.
    Et moi ce qui m'intéresse c'est surtout ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OUT));
    Alors, ton avis?

    (Apparemment ma blague t'as pas fait rire. T'inquiète pas, j'en ferai des mieux. )

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ok, ça change tout d'avoir le contexte.

    Déjà, inutile de faire la copie de l'image : normalement, g.drawImage(bImage, 0, 0, null); suffit à dessiner l'image. Ensuite, il ne faut pas disposer le contexte graphique du composant, mais celui de l'image, et de préférence avant de la redessiner.

    En revanche, difficile de déterminer de l'intérêt du composite sans savoir quel dessin tu veux faire.

    Enfin, pourquoi ne pas dessiner directement dans le contexte du composant ? Si le but est de faire du multibuffering, utiliser soit le hint de JPanel (le paramètre boolean isDoubleBuffered, ou la méthode setDoubleBuffered), soit utiliser la classe BufferStrategy (Voir https://docs.oracle.com/javase/tutor...doublebuf.html). Et si tu es dans une fenêtre fullscreen, utilise un rendu actif plutôt que passif.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 09h59
  2. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 10h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 16h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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