Bonjour à tous,
Je suis en train de faire une sorte de Paint avec java. J'applique le modèle MVC. Le coeur de ma petite application est un cadre (Cadre.java). Dans ce cadre se trouve un tableau de Color[][] qui représentent chaque pixel d'une image. Une vue (VueCadre.java) surveille en permanence ce cadre. C'est à dire qu'à chaque fois qu'un pixel change dans le cadre, il est affiché dans la vue. Ensuite, à partir du cadre, je peux dessiner (sans utiliser les classes prédéfinies de java.awt comme Graphics ou Graphics2D). C'est de là que vient mon premier souci. En effet, lorsque je dessine par exemple des rectangles ou des ellipses, java met beaucoup de temps à les dessiner. Est-ce du au fait que mon image soit sans arrêt redessiner lorsqu'un pixel change dans le cadre ?
Dans VueCadre.java, j'ai:
Sinon, mon application gère aussi la sauvegarde et l'ouverture de fichiers du type *.draw (format personnel), *.bmp (sans table de couleurs) et *.pgm (images à nuances de gris). Quand j'ouvre par exemple une image 200x200, je n'ai pas de soucis (sauf qu'elle met un peu de temps à s'ouvrir) mais si je veux ouvrir une image *.bmp de dimension 1100x1500 alors je suis obligé d'augmenter la mémoire vive de JVM (Xmx128m au lieu de Xmx64m). Je voudrais résoudre ce problème. J'ai remarqué que ce problème venait de ma classe IO.java (classe statique qui regroupe mes fonctions d'E/S). C'est quand je retourne une couleur (new Color(...)) à chaque fois que je lis un pixel dans une image *.bmp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void update(Observable obs, Object obj) { ... g = getGraphics(); x = cadre.getX(); // Retourne la position de la souris dans le cadre y = cadre.getY(); // Pareil Outils.drawPixel(g,x,y,cadre.getPixel(x,y)); // Dessine seulement le pixel modifié dans le JPanel ... }
En résumé, je voudrais améliorer la vitesse d'exécution de mon application. Je pense que cette lenteur vient de mon code (peut-être mal codé). Auriez-vous des idées pour optimiser un peu mon code ?
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 public static Color readBMPColor(DataInputStream stream) { int r, g, b; r = g = b = 255; byte[] octets = new byte[3]; try { stream.read(octets); b = octets[0] & MASK; // avec MASK = 0xFF g = octets[1] & MASK; r = octets[2] & MASK; } catch(IOException ex){} return new Color(r,g,b); }
PS : Mon application n'est pas très volumineuse. Vous pouvez la télécharger ici draw.zip. Les classes on été compilées avec la version 1.6 de java. Pour lancer l'application, faites ./draw.csh (si vous avez linux ou cygwin avec csh) ou java draw/graphique/Draw &. Vous trouverez également la doc dans le fichier *.zip.
Merci de votre aide.
Partager