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
Version imprimable
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;