Bonsoir tout le monde,
j'arrive pas a charger et afficher une image sur mon application JAVA a partir de ma base de donnees (ACCESS).
Quelqu'un peu m'aider ou me donner un bon lien SVP.
Merci.
Bonsoir tout le monde,
j'arrive pas a charger et afficher une image sur mon application JAVA a partir de ma base de donnees (ACCESS).
Quelqu'un peu m'aider ou me donner un bon lien SVP.
Merci.
Et toi, as-tu du code a nous montrer qu'on puisse voir ce que tu as tenté de faire (et éventuellement le corriger) ? Sous quelle format tes images sont-elles stockées dans ta base ?
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Les images sont sous format ''jpg'' je les stocké dans ACCESS, le champ est de type OLE Object.
le code est le suivant:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public void List_DataBase(){ ResultSet rs; final Vector<String> nomColonnes = new Vector<String>(); final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>(); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:Test"); Statement st = con.createStatement(); rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME, Employee.Photo from Employee " + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC"); ResultSetMetaData md = rs.getMetaData(); int nbrColonnes = md.getColumnCount(); //for (int i = 1; i <= nbrColonnes; i++) { for (int i = 1; i < nbrColonnes; i++) { nomColonnes.addElement( md.getColumnName(i) ); } //String [] nomColonnes = {"Time", "Result", "First_Name"}; while (rs.next()) { // Boucle pour remplir la Jtable Vector<Object> row = new Vector<Object>(nbrColonnes); //for (int i = 1; i <= nbrColonnes; i++) { for (int i = 1; i < nbrColonnes; i++) { row.addElement( rs.getObject(i) ); } donnees.addElement( row ); } } catch(Exception e){ System.out.println(" =="+e.getMessage()); System.out.println(" =="+e.getCause()); } JTable table =new JTable(); DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes); table.setModel(model); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(12, 503, 761, 168); getContentPane().add(scrollPane); }
Mon but est d'afficher dans 'Jtable' le contenu des champs (time,result, firstname,lastname) et en même temps je veux afficher l'image stockée dans le champ Photo dans un jpanel. Pour 'Jtable' tout est correct juste j'ai pas réussi a afficher l'image.
Mon code explique comment j'affiche le 'Jtable' mais pour l'image j'ai essayé plusieurs code mais ça n'a pas marché donc je l'ai enlevé.
Pour le moment je ne vois pas grand chose dans ce code qui soit en rapport avec des images. Mais bon, ton but est de récupérer un byte[] depuis ton enregistrement dans ta base (les bits format l'image stockée au format JPG) et d'ensuite d'utiliser ImageIO pour en lire une BufferedImage que tu pourras afficher.
PS : tu mentionnes un OLE object comme type donc vérifie bien que c'est le bon format pour les images et non pas un type Microsoft / Office.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 byte[] bytes = resultSet.getBytes(imageColumnIndex); // Extraire de base. BuferedImage image = null; try (ByteArrayInputStream input = new ByteArrayInputStream(bytes)) { image = ImagIO.read(input); // Conversion en image. }
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
J'ai ajouté ton code pour extraire l'image de la base puis la convertir mais ça n'a pas marché.
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
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 public void List_DataBase(){ ResultSet rs; final Vector<String> nomColonnes = new Vector<String>(); final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>(); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:Test"); Statement st = con.createStatement(); /* rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME from Employee " + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC");*/ rs= st.executeQuery("Select Picture.Photo from Picture"); ResultSetMetaData md = rs.getMetaData(); // Recuperer les meta données int nbrColonnes = md.getColumnCount(); // le nombre de colonnes for (int i = 1; i <= nbrColonnes; i++) {/// Remplir le titre de colonnes nomColonnes.addElement( md.getColumnName(i) ); } while (rs.next()) { // Boucle pour remplir la Jtable Vector<Object> row = new Vector<Object>(nbrColonnes); for (int i = 1; i <= nbrColonnes; i++) { //row.addElement( rs.getObject(i) ); // Recuperer le i eme champs ////////////////////////////////// byte[] bytes = rs.getBytes("Photo"); // Extraire de base. BufferedImage image = null; try (ByteArrayInputStream input = new ByteArrayInputStream(bytes)) { image = ImageIO.read(input);} // Conversion en image. row.addElement(image); /////////////////////////////////// } donnees.addElement( row ); } } catch(Exception e){ System.out.println(" =="+e.getMessage()); System.out.println(" =="+e.getCause()); } JTable table =new JTable(); DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes); table.setModel(model); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(12, 55, 369, 264); getContentPane().add(scrollPane);
Pour essayer j'ai fais une table Picture dans ma base access et j'ai ajouté un champs qui s'appelle Photo de type Ole Objet mais ça n'a pas marché.
Oui mais justement, ton soucis c'est peut-être que le "format OLE", ça n'a en fait rien a voir avec le format JPEG (les bits dans un fichier JPG)... et qu'en fait ta base stocke l'image sous un format propre a Microsoft et que donc que Java (ImageIO) ne peut pas recréer l'image derrière.
Après, ce que tu peux tenter de faire c'est d'ecrire le byte[] que tu viens de sortir de la DB dans un fichier et de tenter de voir si un logiciels de manipulation d'image lambda peut l'ouvrir sans planter ce qui serait une bonne indication que le tableau contient bien des données au format JPEG.
Voir aussi :
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Bonjour,
Le format OLE ajoute des heders à ton image , tu ne peux pas la récupérer dans un byte[].
La solution a ton problème est probablement ici : https://blogs.msdn.microsoft.com/pra...as-ole-object/
Bonjour Jimmy,
J'ai essayé ton code mais il affiche une erreur de ce genre : Unable to determine image format.
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
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 public void List_DataBase(){ ResultSet rs; final Vector<String> nomColonnes = new Vector<String>(); final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>(); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:Test"); Statement st = con.createStatement(); /* rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME from Employee " + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC");*/ rs= st.executeQuery("Select Picture.Photo from Picture"); ResultSetMetaData md = rs.getMetaData(); // Recuperer les meta données int nbrColonnes = md.getColumnCount(); // le nombre de colonnes for (int i = 1; i <= nbrColonnes; i++) {/// Remplir le titre de colonnes nomColonnes.addElement( md.getColumnName(i) ); } while (rs.next()) { // Boucle pour remplir la Jtable Vector<Object> row = new Vector<Object>(nbrColonnes); for (int i = 1; i <= nbrColonnes; i++) { //row.addElement( rs.getObject(i) ); // Recuperer le i eme champs OLEImage oleImage = new OLEImage(); // using with JPEG format InputStream input = rs.getBinaryStream("Photo"); byte buffer[] = oleImage.getByteImgFromOLEInputStream(input, "JPEG"); ImageIcon icon = new ImageIcon(buffer); row.addElement(icon); /////////////////////////////////// } donnees.addElement( row ); } } catch(Exception e){ System.out.println(" =="+e.getMessage()); System.out.println(" =="+e.getCause()); } JTable table =new JTable(); DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes); table.setModel(model); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(12, 55, 369, 264); getContentPane().add(scrollPane); }
Note pour les lecteurs de la discussion : le lien posté plus haut est vers du code C#. La version Java est donnée dans les commentaires de l'article : Java, Remove OLE headers from images stored as OLE Objects in access database
As-tu testé avec un autre format d'image (BMP, PNG, etc.) ? Test images dans ta BD ne sont peut-être pas au format JPEG.
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Oui bouye j'ai utilisé la version java du code qui se trouve dans le premier commentaire de l'article. j'ai testé aussi avec d'autres formats mais a chaque fois "même erreur" : Unable to determine image format.
Bonjour tout le monde,
J'ai réussi a afficher l'image (en faisant appel a la classe oleImage (Le lien est au dessus) pour retirer les heders des images) dans un Jpanel par contre ça n'a pas marché avec Jtable (au lieu d'avoir l'image je reçois une ligne de ce genre dans la Jtable "javax.swing.ImageIcon@19aa1efe".
Mon code est le suivant :
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
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 public void List_DataBase(){ ResultSet rs; ResultSet rs1 ; final Vector<String> nomColonnes = new Vector<String>(); final Vector<Vector<Object>> donnees = new Vector<Vector<Object>>(); final Vector<String> nomColonnes1 = new Vector<String>(); final Vector<Vector<Object>> donnees1 = new Vector<Vector<Object>>(); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:PalmSecureDB"); Statement st = con.createStatement(); rs= st.executeQuery("Select Authentication.Time, Authentication.Result, Employee.First_Name, Employee.Last_NAME from Employee " + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID Order By Authentication.Time DESC"); ResultSetMetaData md = rs.getMetaData(); // Recuperer les meta données int nbrColonnes = md.getColumnCount(); // le nombre de colonnes for (int i = 1; i <= nbrColonnes; i++) {/// Remplir le titre de colonnes nomColonnes.addElement( md.getColumnName(i) ); } while (rs.next()) { // Boucle pour remplir la Jtable Vector<Object> row = new Vector<Object>(nbrColonnes); for (int i = 1; i <= nbrColonnes; i++) { row.addElement( rs.getObject(i) ); // Recuperer le i eme champs } donnees.addElement( row ); } //rs1= st.executeQuery("Select Employee.PIC from Employee"); rs1= st.executeQuery("Select Employee.PIC from Employee "); + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID"); //rs1= st.executeQuery("Select Employee.PIC from Employee " // + "INNER JOIN Authentication ON Employee.UserID=Authentication.UserID"); // rs1= st.executeQuery("Select Picture.Photo FROM Picture" // + "INNER JOIN Picture ON Employee.UserID=Picture.UserID"); ResultSetMetaData md1 = rs1.getMetaData(); // Recuperer les meta données int nbrColonnes1 = md1.getColumnCount(); // le nombre de colonnes for (int i = 1; i <= nbrColonnes1; i++) {/// Remplir le titre de colonnes nomColonnes1.addElement( md1.getColumnName(i) ); } while (rs1.next()) { // Boucle pour remplir la Jtable Vector<Object> row1 = new Vector<Object>(nbrColonnes1); for(int i = 1; i <= nbrColonnes1; i++) { //row1.addElement( rs1.getObject(i) ); // Recuperer le i eme champs OLEImage oleImage = new OLEImage(); // using with JPEG format InputStream input = rs1.getBinaryStream("PIC"); byte buffer[] = oleImage.getByteImgFromOLEInputStream(input, "GIF"); ImageIcon icon = new ImageIcon(buffer); row1.addElement( icon ); // JLabel Label = new JLabel(icon); // lbl1Image.add(Label); donnees1.addElement( row1 ); }}} catch(Exception e){ System.out.println(" =="+e.getMessage()); System.out.println(" =="+e.getCause()); } JTable table1 =new JTable(donnees1, nomColonnes1); JScrollPane scrollPane1 = new JScrollPane(table1); table1.setRowHeight(240); JTable table =new JTable(); DefaultTableModel model = new DefaultTableModel(donnees, nomColonnes); table.setModel(model); JScrollPane scrollPane = new JScrollPane(table); scrollPane1.setBounds(12, 55, 369, 264); scrollPane.setBounds(12, 503, 761, 168); getContentPane().add(scrollPane); getContentPane().add(scrollPane1); }
NB: Pour faciliter un peu les choses, il s'agit d'une application d'authentification (par la pomme de la main) en utilisant un capteur. donc a chaque fois qu'une personne mets la main au dessus du capteur et ce dernier la capte il va enregistrer directement dans la Base de données la date,nom et prénom de la personne, en même temps il va l'afficher avec Jtable dans l'application les informations sur la personne identifiée.
Ma première Jtable marche très bien et m'affiche correctement les informations. Mon problème est dans ma deuxième Jtable1 où je veux afficher l'image de la personne identifier. Donc a chaque identification une nouvelle Image qui va être afficher a la place de l’ancienne.
Pour pouvoir afficher une image dans une JTable il te faut :
- Soit placer un cell renderer pour cette colonne qui soit capable d'afficher une image :
Ça peut être aussi utile de créer un renderer custom si tu as des données de plusieurs types dans une même colonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part jTable.getColumnModel().getColumn(0).setCellRenderer(jTable.getDefaultRenderer(ImageIcon.class));- Soit renseigner la classe appropriée pour la colonne en surchargeant la méthode getColumnClass() de la JTable.
La JTable mettra alors d'elle même un cell renderer par défaut qui peut afficher les images sur cette colonne.
Utile lorsque tu as un type unique dans la colonne.
Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager