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

avec Java Discussion :

programmer un mini-paint


Sujet :

avec Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 83
    Points : 71
    Points
    71
    Par défaut programmer un mini-paint
    Après m'être tapé plein d'exercices relou sur le java je voudrais faire une première application, en essayant de pas faire trop ambitieux pour mon niveau de newbie total.

    J'arrive à faire une fenêtre avec un jcanvas pour l'instant mais j'arrive pas à gérer les images dedans. J'ai testé une tonne de classes qui permettent de gérer l'image et je m'en sors pas... y'a à boire et à manger là dedans et je ne sais pas de quoi j'ai exactement besoin pour ce que je veux faire.

    Voilà l'application que je souhaite réaliser, un genre de paint mais minimaliste:

    1 - je veux pouvoir dessiner au crayon uniquement, pixel par pixel.
    2 - je veux avoir accès au tableau de pixels pour pouvoir le sauvegarder dans un format "maison"
    3 - je veux pouvoir raisonner avec une palette de couleurs, genre 4 bit, comme sur le vieux paint des années 50

    Quelles sont les classes de gestion d'image adéquates pour faire ce type d'application ?

    J'ai testé le bufferedimage, le image, le memoryimagesource, le raster, le databuffer, et tout le tralala, et étant donné que je suis un newbie intégral je n'y comprends strictement rien.

    Si quelqu'un peut m'éclairer sur les bonnes classes à utiliser... merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Honnêtement, tu utiliserais juste un simple byte[][] ou byte[] pour stocker tes pixels, et tu aurais ton bonheur. C'est vraiment pas utile de se compliquer la vie -_-°.

    Mais si tu veux absolument le faire en utilisant la logique d'image de Java pur, c'est :
    - IndexColorModel pour définir ce que c'est, tes couleurs sur 4 bits
    - BufferedImage pour représenter l'image elle-même.
    - WritableRaster pour accéder à ses pixels.

    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
    int nbBitsPerPixel = 4;
    int nbColors = 16;
     
    // définition des couleurs possibles (ici 16 niveaux de gris)
    byte[] reds = {
    		(byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77,
    		(byte)0x88, (byte)0x99, (byte)0xAA, (byte)0xBB, (byte)0xCC, (byte)0xDD, (byte)0xEE, (byte)0xFF};
    byte[] greens = {
    		(byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77,
    		(byte)0x88, (byte)0x99, (byte)0xAA, (byte)0xBB, (byte)0xCC, (byte)0xDD, (byte)0xEE, (byte)0xFF};
    byte[] blues = {
    		(byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77,
    		(byte)0x88, (byte)0x99, (byte)0xAA, (byte)0xBB, (byte)0xCC, (byte)0xDD, (byte)0xEE, (byte)0xFF};
     
    IndexColorModel colorModel = new IndexColorModel(nbBitsPerPixel, nbColors, reds, greens, blues);
     
    int width = 640;
    int height = 480;
     
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, colorModel);
     
    WritableRaster raster = image.getRaster();
     
    // Mettre la couleur numéro 15 au pixel (5,5)
    int x = 5;
    int y = 5;
    int band = 0; // pas de concept de bande en couleurs indexées.
    int color = 15;
    raster.setSample(x, y, band, 15);
     
    // Récupérer quelle est la couleur au pixel (10, 10)
    color = raster.getSample(10, 10, band);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 83
    Points : 71
    Points
    71
    Par défaut
    Je vais essayer de faire ton code, ça ressemble à ce que j'étais en train de faire mais avec les erreurs en moins.

    Citation Envoyé par thelvin Voir le message
    Honnêtement, tu utiliserais juste un simple byte[][] ou byte[] pour stocker tes pixels, et tu aurais ton bonheur. C'est vraiment pas utile de se compliquer la vie -_-°.
    Je suis pour la simplicité donc ça me va.
    Quelle classe d'image dois-je utiliser pour afficher le byte[] ?

    Peut-être juste la même ? Sauf que je gère le palettage moi-même avec deux tableaux...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par noobjava Voir le message
    Quelle classe d'image dois-je utiliser pour afficher le byte[] ?
    Aucune, tu prends chaque pixel et tu le passes à l'affichage. C'est ce que tu as demandé, je te le rappelle.

    Si tu veux une vraie image affichable, alors il va falloir passer par BufferedImage avec le code montré.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 83
    Points : 71
    Points
    71
    Par défaut
    Ouais le plus simple c'est encore de faire setRGB()...

    J'ai pas l'habitude de la philosophie java, j'en suis encore à me casser la tête avec l'optimisation...

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 83
    Points : 71
    Points
    71
    Par défaut
    Ha bé non chai pas pourquoi le setRGB() ça marche pas.

    Ton setSample() fonctionne, merci beaucoup pour ton aide

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Juste pour rappel, setRGB() consiste, comme son nom l'indique, à donner une couleur RGB (32-bit) à un pixel.

    Or ton image n'est pas en RGB, mais en couleurs indexées sur 4-bit, pour un total de 16 couleurs différentes. Si cette couleur RGB n'existe pas dans le ColorModel que tu as donné à ton image, à la place ça utilisera la couleur existante la plus proche, bien entendu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 83
    Points : 71
    Points
    71
    Par défaut
    Heu bien non justement j'ai fait une image argb, je gère le palettage derrière avec des tableaux.

    Les pixels se remplissent bien quand je fais setRGB() sur le constructeur de ma sous-classe de jpanel, par contre sur l'event update() ça ne marche plus, je sais pas pourquoi.

    Donc non c'est bien l'objet raster qu'il faut utiliser. J'ai vu qu'il permet aussi de mettre à jour plein de pixels d'un coup en balançant un tableau dedans.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    setRGB() ou passer par le raster, les deux marchent. Si tu as quelque chose qui ne marche pas, ça vient d'une autre différence que tu as fait entre les deux.

    Pas la peine de dire "non non, aucune autre différence." Je viens de te dire que si. Au pire tu ne t'en rappelle plus, c'est tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [OWL] conception d'un mini paint
    Par missweb7 dans le forum UML
    Réponses: 12
    Dernier message: 21/01/2013, 12h00
  2. programmer un mini shell!
    Par nixmind dans le forum C
    Réponses: 36
    Dernier message: 21/11/2010, 18h05
  3. Réponses: 10
    Dernier message: 26/10/2006, 12h35
  4. Réponses: 4
    Dernier message: 09/10/2006, 22h12
  5. Réponses: 2
    Dernier message: 07/06/2006, 12h12

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