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 :

Dessiner des images sur une BufferedImage


Sujet :

2D Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Dessiner des images sur une BufferedImage
    Bonjour à tous,

    Pour le jeu sur lequel je travaille, je dois afficher un grand nombre d'images dans toutes les directions imaginables (==> rotations, mises à l'échelle), et pour l'instant j'affiche tout ça avec des instructions du type
    "g.rotate(..)
    g.translate(..)
    g.drawImage(..)"
    Utiliser les AffineTransform ferait le même effet.

    Au point où il en est, mon jeu est encore très fluide, mais pour la suite, avec beaucoup plus d'éléments à afficher, j'aurai besoin d'afficher tout le rendu d'un coup au lieu d'afficher les éléments les uns après les autres.
    Je n'ai donc pas encore essayé de créer une BufferedImage pixel par pixel, mais je pense que ce serait une énorme perte de performances.
    Donc voilà mes questions:
    Est-ce qu'il existe un autre moyen d'écrire une BufferedImage que de définir chaque pixel avec ses coordonnées et sa couleur RGBA ?
    Est-ce qu'on peut "additionner" des objets de type Area (avec sa couleur) ou Image sur une BufferedImage (ou un type similaire) ?

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je suppose que les "g.rotate(..), g.translate(..), g.drawImage(..)" dont tu parles, tu les invoques sur l'instance de Graphics passée en paramètre de la méthode paint() d'un Canvas (ou paintComponent d'un JPanel), n'est-ce-pas ?
    Et bien dessiner dans une image, çà utilise exactement le même système :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Graphics2D g = bufferedImage.createGraphics();
    try {
    //ici tu dessines avec g exactement de la même manière que dans pour le Graphics des méthodes paintxxx. En plus, même pas besoin de caster en Graphics2D si nécessaire
    }
    finally {
       g.dispose(); // toujours penser à libérer la mémoire à la fin
    }
    Ensuite, tu parles d'additionner des objets de type Area directement (ou combiner plus généralement) : alors, non, on ne peut pas le faire. Tout ce qui est dessiner dans le contexte bitmap est en bitmap : la nature vectorielle (d'une instance d'Area) est donc perdue. On peut faire toutes les combinaisons voulues avant de faire le dessin final, mais ceci est plutôt lent comparé au dessin bitmap. Il y a plusieurs techniques qui permettent de s'en sortir :
    • dessiner une forme dans une image transparente et la dessiner elle-même sur l'image globale. Si ta forme est censée varier, tu peux dessiner plusieurs images, chacune correspondant à chaque variation. Cela va prendre beaucoup plus de mémoire, mais accélérera nettement le rendu graphique (c'est d'ailleurs la plupart du temps le cas : pour accélérer du code, on consomme plus de mémoire (principe même des caches).
    • utiliser les composites qui pourront te permettront de faire certaines combinaisons bitmap entre 2 images (par union ou intersection, mais également en combinant avec la couche alpha, pour faire par exemple, une notion de projecteur de lumière qui révèle une partie de l'image)


    Enfin, il y a également la notion de multibuffering qui est un peu une solution intermédiaire entre la solution de tout dessiner en direct dans le contexte graphique, ou de passer par des images bitmap intermédiaires. Cette technique est là surtout pour éviter le flickering dû au fait qu'on peut ne pas avoir fini de dessiner l'écran, alors qu'on a besoin de rafraîchir l'écran: en combinant des images bitmap et cette technique tu gagneras surtout en fluidité.

    En tout, dessiner une image point par point est à proscrire (donc sous entendu en faisant des double boucles) : ce sera effectivement très très long. Éventuellement, des transferts de tableau (de raster) sur certaines parties peuvent être faits assez rapidement.
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut

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

Discussions similaires

  1. Dessiner des lignes sur une image
    Par g_barthe dans le forum wxPython
    Réponses: 2
    Dernier message: 10/10/2008, 11h29
  2. dessiner des cercles sur une image avec java
    Par inès83 dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 04/05/2008, 17h34
  3. Connectivité pour délimiter des formes sur une photo
    Par romu37fr dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/06/2007, 13h28
  4. [Image]Dessiner des rectangles sur une image
    Par navona dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 09/03/2006, 22h51
  5. Dessiner un rectangle sur une forme
    Par Neo41 dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2005, 01h08

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