non pas un dégradé je veux un buton qui manipule l'intensité de tous les cercles
Version imprimable
non pas un dégradé je veux un buton qui manipule l'intensité de tous les cercles
alors personne n a aucune idée sur ça?
Bonjour,
Si si c'est toujours faisable
pense à :resolu: et :plusser: :mouarf:Code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 import javax.swing.*; import java.util.*; import java.awt.geom.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; public class DemoCercleRandom extends JFrame implements ActionListener, ChangeListener{ ArrayList<Ellipse2D.Float> listCercles = new ArrayList<Ellipse2D.Float>(); int nombreDeCercles = 20; int rayon= 30; JTextField textNombreDeCercles = new JTextField(3); JTextField textRayonDesCercles = new JTextField(3); JButton bouton = new JButton("Rafraichir"); CercleRandom c; JSlider slider = new JSlider(0,255,0); public static void main(String[] args) throws Exception { DemoCercleRandom D = new DemoCercleRandom(); } public DemoCercleRandom() { //setSize(1024,1024); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panelNord = new JPanel(); panelNord.add(new JLabel("Nombre de cercles")); panelNord.add(textNombreDeCercles); panelNord.add(new JLabel("Rayon des cercles")); panelNord.add(textRayonDesCercles); panelNord.add(bouton); panelNord.add(slider); slider.addChangeListener(this); bouton.addActionListener(this); add(panelNord, BorderLayout.NORTH); textNombreDeCercles.setText(""+20); textRayonDesCercles.setText(""+30); try { c = new CercleRandom(); add(c,BorderLayout.CENTER); } catch(Exception e) { } pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { nombreDeCercles = Integer.parseInt(textNombreDeCercles.getText()); rayon = Integer.parseInt(textRayonDesCercles.getText()); listCercles.clear(); c.setVisible(false); this.remove(c); c = new CercleRandom(); add(c,BorderLayout.CENTER); c.setVisible(true); } public void stateChanged(ChangeEvent e) { repaint(); } class CercleRandom extends JPanel { public CercleRandom() { double x,y; boolean bool = false; setPreferredSize(new Dimension(700,700)); x = Math.random()*(700-2*rayon); y = Math.random()*(700-2*rayon); Ellipse2D.Float temp; boolean ok = false; listCercles.add(new Ellipse2D.Float((float)x,(float)y,2*rayon,2*rayon)); int attempt = 0; while ( listCercles.size()<nombreDeCercles && !bool) { x = Math.random()*(700-2*rayon); y = Math.random()*(700-2*rayon); temp = new Ellipse2D.Float((float)x,(float)y,2*rayon,2*rayon); for (int j=0; j< listCercles.size();j++) { if (!temp.intersects(listCercles.get(j).getBounds2D())) { ok = true; } else { ok = false; break; } } if (ok) listCercles.add(temp); if (attempt++>=10000) { JOptionPane.showMessageDialog(this,"Trop d'essais sans trouver de solutions, changez les parametres."); bool = true; } } } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setColor(Color.BLUE); g2.fillRect(0,0, 700, 700); g2.setColor(new Color(slider.getValue(),slider.getValue(),slider.getValue())); for (int i=0; i < nombreDeCercles;i++) { g2.fill(listCercles.get(i)); } } } }
voila merci comment on fait pour coder sur 32 bits ou 16 bits
sans passer par RGB
Pas très claire.
Coder en 32 bits des couleurs ? (donc une image a haute dynamique ce qui me semble pas ce que tu cherches en réalité a moins que cela ne soit du 24 (rgb)+8 bit d'alpha).
Sans passer par RGB ? Ma foie j'imagine que tu parles donc d'image grayscale.
Donc dans ce cas, code tes couleurs en 8 bits en créant une image grayscale (BufferedImage.TYPE_BYTE_GRAY)
Enfin comme dans le code il n'est pas question d'images ni rien, je ne comprends pas la question à mon avis.
32 bits que du gris pas d autre couleurs??
Tu peux faire l'effort d'essayer de te faire comprendre ou pas ?!Citation:
32 bits que du gris pas d autre couleurs??
sur le code ci dessus les cercles prennent des couleurs en RGB {setColor} maintenant je veux que ca ce soit en gris 32 bits
je sais pas si c'est clair ou pas
Bon comment dire en gros, si tu utilises le truc de base et que tu ne joues pas avec des colorspace spéciaux etc :
setColor il veux 3 composantes (Rouge, Vert, Bleu), chacune codées sur 8 bits.
Avec un éventuelle composante alpha de 8 bits. (pour la transparence).
Donc quoiqu'il arrive tu pourras lui donner une couleur 24 bit ou 32 bit.
Mais ton degradé de noir/gris/blanc au final sera sur 256 nuances (donc 8 bits).
Après je ne vois pas comment t'aider plus.
colorSpace ? alors on doit procéder comment ?
Bah tu utilises le dernier code de ludomacho et voila tu aurais tes nuances de gris sur 256 valeurs possible du noir au blanc. (avec la composante r=g=b).
Sinon pour le colorspace, a moins que tu n'en aies réelement besoin, ce dont je doute, tu peux toujours jetter un oeil a
http://docs.oracle.com/javase/1.4.2/...awt/Color.html
et
http://docs.oracle.com/javase/1.4.2/...olorSpace.html
oui j'en ai vraiment besoin de ca.
toujours rien
grayscale j' ai vu que c'est tres compliqué c pour un traitement d image que je cherche ca
j aimerai avoir des images qui contient des cercles non chevauché mais codé en 32 bits niveaux gris (grayscale)
pas de réponses!!!!
non, misterTwo, toujours pas...
:) je vois que je suis devenu célèbre!!!!
Pour les niveaux de gris, il a déjà été dit que c'est comme une couleur normale pour laquelle la composante rouge égale la composante bleue égale la composante verte. Si tu es arrivé à faire des couleurs, tu sauras faire des gris.
Moi je voudrais répondre au titre du sujet. Je rappelle que les équations paramétrique de l'ellipse sont:
x=R1.cos(t)
y=R2.sin(t)
Avec t, le paramètre, R1 et R2 les deux rayon de l'ellipse (l'oval comme tu appelles cela)
Ainsi tu peux éviter le chevauchement des ellipses.
oui merci pour ta réponse, pour le gris que je veux il faut que ca soit sur 32 bits grayscale? alors sur le code c'est du RGB 24 bits
Ce que tu demandes n'existe pas. Les meilleurs yeux voient 200 nuances sur une couleurs. Un octets (256 valeurs) est largement suffisant. Comme au fond de l'oeil, il y a 3 capteurs différent rouge vert bleu) on utilise 3 octets, soit 24 bits. Par dessus le marché, on peut ajouter un canal qui indique la transparence par un octet. Soit 4 octets, soit 32 bits.
Vouloir 4 milliards de gris, c'est juste une grosse blague. Il n'y en a que 256 (sans compter la transparence) et tes yeux ne verront pas la différence.
oui je suis d'accord avec toi je voulais au moins des images 16 bits en gris comme les images microscopiques car je veux les analyser avec des gaussiens
s'il y a quelqu'un qui peut m'aider a avoir des idées sur ce sujet
creation des images qui contient des cercles aléatoire (codé en 16 bits ou plus niveaux gris)que je peux enregistrer et choisir le nombre des cercles et leur rayon .
Est-ce que tu pourrais faire l'effort de comprendre qu'on a aucune idée de ce que tu appelles "16 bits niveau de gris" ?
Ça a été dit combien de fois, déjà, 5 ?
Bonjour . On est la pour s’entraider. bref!!!
par exemple quand tu dessine un objet en (couleur RGB 3 canaux) chaque canal est sur 8 bits rouge et vert et bleu. je veux codé sur (2 correspond à 16 bits) ou 4 qui correspond à 32 bits) canaux
2 canaux gris.
Le premier qui indique un niveau de gris, et le deuxième qui indique... Un autre niveau de gris ?
Il n'existe pas de modèle de couleur en Java... Ni autre part d'ailleurs, qui possède 2 canaux. Ni qui possède plus d'un canal représentant la même chose.
Rien ne t'empêche de travailler sur des matrices de bytes pour émuler ça, et de programmer le dessin d'ovales sur ce modèle.
Mais si c'est vraiment ce que tu veux faire, et que tu veux de l'aide, il faut au minimum nous dire la différence entre le premier canal de gris et le second canal de gris.
oui c ca que je veux, normalement on arrive a avoir un niveau de gris sur 8 bits ben moi je veux que ca soit sur 16 bits ou 32 bits???
Bon. Donc c'est vraiment un canal de gris, et sur 16 bits au lieu de 8. (Les 32 bits je confirme que je trouve ça nulle part.)
J'aurais pas cru que ça existe, mais ça existe.
Les écrans informatiques ne peuvent pas afficher ça par contre, donc ça ne sert à rien d'afficher directement sur l'écran. Il faut créer une image en mémoire et dessiner là-dessus.
Voici comment créer une image en niveau de gris exprimés sur 16 bits :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 int width = 800; int height = 800; // Création de l'image, noire au début BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY); // création d'un Graphics2D qui dessine sur cette image Graphics2D g = image.createGraphics(); // sélection d'un niveau de gris, disons 1/4 de blanc et 3/4 de noir float grayLevel = 0.25f; // Transformation de ce niveau de gris en objet Color, utilisable pour le dessin Color color = new Color(ColorSpace.getInstance(ColorSpace.CS_GRAY), new float[] {grayLevel}, 1f); // Utiliser cette couleur pour le dessin g.setColor(color); // Dessiner un ovale comme d'hab g.drawOval(5, 5, 790, 790); // enregistrer l'image dessinée comme d'hab File file = new File("imageGrise.png"); ImageIO.write(image, "PNG", file);
Extrêmement bonne réponse sur ce coup la j'avoue.
Je n'avais même jamais fait attention à ce TYPE_USHORT_GRAY moi même.
Par contre le support des images en 32 bits (même plus) couleurs manque un peu en java je trouve (exr, hdr, etc).
Merci thelvin pour tes recherches.
Merci beaucoup
j ai deux classes pour faire de tel image avec la méthode de thelvin .
Ce qui j ai marqué en rouge me pose quelque problème car je n'arrive pas a a avoir mes dessins et ensuite a les enregistrer??
Deuxieme classeCode:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.color.ColorSpace; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.awt.image.RescaleOp; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class PanDessin1 extends JPanel { BufferedImage monImage = null; public PanDessin1() { super(); } protected void paintComponent(Graphics g) { super.paintComponent(g); if(monImage != null) g.drawImage(monImage, 0, 0, null); } protected void ajouterImage(File fichierImage) { // desiiner une image à l'ecran try { monImage = ImageIO.read(fichierImage); } catch (IOException e) { e.printStackTrace(); } repaint(); } protected void creerImage(){ int width = 800; int height = 800; // Création de l'image, noire au début BufferedImage image= new BufferedImage(width,height, BufferedImage.TYPE_USHORT_GRAY); // création d'un Graphics2D qui dessine sur cette image Graphics2D g = image.createGraphics(); // sélection d'un niveau de gris, disons 1/4 de blanc et 3/4 de noir float grayLevel = 0.25f; // Transformation de ce niveau de gris en objet Color, utilisable pour le dessin Color color = new Color(ColorSpace.getInstance(ColorSpace.CS_GRAY), new float[] {grayLevel}, 1f); // Utiliser cette couleur pour le dessin g.setColor(color); // Dessiner un ovale comme d'hab g.drawOval(5, 5, 590, 590); repaint(); } protected BufferedImage getImagePanneau() { // récupérer une image du panneau int width = this.getWidth(); int height = this.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); this.paintAll(g); g.dispose(); return image; } protected void enregistrerImage(File fichierImage) { String format ="JPG"; BufferedImage image = getImagePanneau(); try { ImageIO.write(image, format, fichierImage); } catch (IOException e) { e.printStackTrace(); } } }
Code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.WindowConstants; public class Cadre1 extends JFrame implements ActionListener{ private final JMenuBar menuBar = new JMenuBar(); private final JMenu fichierMenu = new JMenu(); private final JMenuItem ouvrirMenu = new JMenuItem(); private final JMenu filtreMenu = new JMenu(); private final PanDessin1 panneau = new PanDessin1(); private final JMenuItem enregistrerMenu = new JMenuItem(); private final JMenu creerImg = new JMenu(); private final JMenuItem _8BitsMenu = new JMenuItem(); private final JMenuItem _16BitsMenu = new JMenuItem(); public Cadre1() { super(); setBounds(100, 100, 500, 375); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); try { creerMenu(); } catch (Throwable e) { e.printStackTrace(); } // } private void creerMenu() throws Exception { // construction du menu setJMenuBar(menuBar); menuBar.add(fichierMenu); fichierMenu.setText("Fichier"); fichierMenu.add(ouvrirMenu); ouvrirMenu.addActionListener((ActionListener)this); ouvrirMenu.setText("ouvrir"); fichierMenu.add(enregistrerMenu); enregistrerMenu.addActionListener((ActionListener)this); enregistrerMenu.setText("enregistrer"); menuBar.add(creerImg); creerImg.setText("créer"); creerImg.add(_8BitsMenu); _8BitsMenu.addActionListener((ActionListener)this); _8BitsMenu.setText("img 8 bits"); creerImg.add(_16BitsMenu); _16BitsMenu.addActionListener((ActionListener)this); _16BitsMenu.setText("img 16 bits"); // ajouter le panneau de dessin getContentPane().add(panneau); } public void actionPerformed(ActionEvent cliqueMenu) { if (cliqueMenu.getSource().equals(ouvrirMenu)) { JFileChooser fileOuvrirImage = new JFileChooser(); if (fileOuvrirImage.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { panneau.ajouterImage(new File(fileOuvrirImage.getSelectedFile() .getAbsolutePath())); } } else if (cliqueMenu.getSource().equals(enregistrerMenu)) { JFileChooser fileEnregistrerImage = new JFileChooser(); if (fileEnregistrerImage.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { File fichierEnregistrement = new File(fileEnregistrerImage.getSelectedFile().getAbsolutePath()+ ".JPG"); panneau.enregistrerImage(fichierEnregistrement); } } else if (cliqueMenu.getSource().equals(_8BitsMenu)) { panneau.creerImage();} } public static void main(String args[]) { try { Cadre1 frame = new Cadre1(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }
Pour la procédure creerImage() car il n'y a que ca qui est intéressant :
1) C'est normal que ca n'enregistre rien, tu as commenté les 2 lignes pour écrire dans le fichier.
2) Chez moi en dé commentant les 2 lignes ca marche très bien. Il m'écrit bien un PNG avec un joli cercle gris. (en 16 bit de surcroit comme demandé).
ok tu peux me donner ton code qui marche pour voir ou j'ai pu me trompé
merci
C'est toi qui a posté le code =)
Moi je n'ai qu'extrait la fonction, décommenté les 2 lignes susmentionnées puis executé la fonction.
je ne vois pas j ai toutes essayé sans succès
Il faut dé-commentez ces 2 lignes, sans quoi tu n'auras pas ton fichier PNG écrit.
Mais ca ne concerne que cette fonction qui crée l'image et l'écrit dans un ficheir. Je n'ai pas testé le reste...Code:
1
2 // File file = new File("imageGrise.png"); // ImageIO.write(image, "PNG", file);
je l ai fait mais rien
Bon et bien je vais te décrire la façon dont tu faire fonctionner TON logiciel tel qu'il est écrit la: (En décommentant bien entendu les 2 lignes)
1) Créer->8 bit. (Cela crée un fichier imageGris.png que tu peux vérifier avec un logiciel de dessin ou autres).
2) Fichier->ouvrir puis choisir ce fichier et la magie il apparait dans ton interface.
Je pense que maintenant tu devrais être capable de poursuivre seul en corrigeant le code si le comportement ne te conviens pas.
Remplace new File("imageGrise.png"); par new File("c:/temp/imageGrise.png");.
L'image sera enregistrée dans le fichier c:/temp/imageGrise.png
si vous pouviez regarder sur mes deux classes pourquoi ca marche pas?
Non. "ca marche pas" n'est pas une question recevable.
Dis ce que tu aimerais obtenir, ce que tu obtiens vraiment, et pourquoi le code que tu as devrait faire en sorte de créer ce que tu voulais au lieu de ce qu'il fait vraiment.
j'ai créée deux classes PanDessin et Cadre j ai intégré la méthode creerImage pour que je puisse créer l image et ensuite l 'enregistrer avec mon inteface mais je vois que ma méthode crée pas d'image, c'est pas par ce que la méthode ne fonctionne pas, mais elle interagit pas avec mon interface et le reste de mon code.
Bonjour,
Dites moi comment on fait pour intégrer les classes qui dessiner les cercles aleatoirement
dans caCode:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 public class DemoCercleRandom extends JFrame implements ActionListener, ChangeListener{ ArrayList<Ellipse2D.Float> listCercles = new ArrayList<Ellipse2D.Float>(); int nombreDeCercles = 20; int rayon= 30; JTextField textNombreDeCercles = new JTextField(2); JTextField textRayonDesCercles = new JTextField(2); JButton bouton = new JButton("Rafraichir"); CercleRandom c; JSlider slider = new JSlider(0,255,0); public static void main(String[] args) throws Exception { DemoCercleRandom D = new DemoCercleRandom(); } public DemoCercleRandom() { //setSize(1024,1024); setTitle ("ICS TESTING"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panelNord = new JPanel(); panelNord.add(new JLabel("Nombre cercles")); panelNord.add(textNombreDeCercles); panelNord.add(new JLabel("Rayon cercles")); panelNord.add(textRayonDesCercles); panelNord.add(bouton); panelNord.add(slider); slider.addChangeListener(this); bouton.addActionListener(this); add(panelNord, BorderLayout.NORTH); textNombreDeCercles.setText(""+20); textRayonDesCercles.setText(""+30); try { c = new CercleRandom(); add(c,BorderLayout.CENTER); } catch(Exception e) { } pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { nombreDeCercles = Integer.parseInt(textNombreDeCercles.getText()); rayon = Integer.parseInt(textRayonDesCercles.getText()); listCercles.clear(); c.setVisible(false); this.remove(c); c = new CercleRandom(); add(c,BorderLayout.CENTER); c.setVisible(true); } public void stateChanged(ChangeEvent e) { repaint(); } class CercleRandom extends JPanel { public CercleRandom() { double x,y; boolean bool = false; setPreferredSize(new Dimension(600,600)); x = Math.random()*(600-2*rayon); y = Math.random()*(600-2*rayon); Ellipse2D.Float temp; boolean ok = false; listCercles.add(new Ellipse2D.Float((float)x,(float)y,2*rayon,2*rayon)); int attempt = 0; while ( listCercles.size()<nombreDeCercles && !bool) { x = Math.random()*(600-2*rayon); y = Math.random()*(600-2*rayon); temp = new Ellipse2D.Float((float)x,(float)y,2*rayon,2*rayon); for (int j=0; j< listCercles.size();j++) { if (!temp.intersects(listCercles.get(j).getBounds2D())) { ok = true; } else { ok = false; break; } } if (ok) listCercles.add(temp); if (attempt++>=10000) { JOptionPane.showMessageDialog(this,"Trop de tentatives sans trouver de solutions, changez les parametres."); bool = true; } } } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setColor(Color.black); g2.fillRect(0,0, 600, 600); g2.setColor(new Color(slider.getValue(),slider.getValue(), slider.getValue())); for (int i=0; i < nombreDeCercles;i++) { g2.fill(listCercles.get(i)); } } } }
merciCode:
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 protected void creerImage(){ //System.out.println("ok"); int width =600; int height =600; // Création de l'image, noire au début BufferedImage imageCreer = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY); // création d'un Graphics2D qui dessine sur cette image Graphics2D g = imageCreer.createGraphics(); //surfaceImg.drawImage(monImage, null, null); monImage= imageCreer; // création d'un Graphics2D qui dessine sur cette image // sélection d'un niveau de gris, disons 1/4 de blanc et 3/4 de noir float grayLevel = 1f; // Transformation de ce niveau de gris en objet Color, utilisable pour le dessin Color color = new Color(ColorSpace.getInstance(ColorSpace.CS_GRAY), new float[] {grayLevel}, 1f); // Utiliser cette couleur pour le dessin g.setColor(color); // Dessiner un ovale comme d'hab g.fillOval(15, 15, 290, 290); // enregistrer l'image dessinée comme d'hab //File file = new File("image1.jpg"); //ImageIO.write(monImage, "PNG", file); //repaint(); repaint(); }
Une chose que je peux te dire c'est qu'il ne faut pas faire
maisCode:Graphics2D g2 = (Graphics2D) g.create();
Code:Graphics2D g2 = (Graphics2D) g;