Bonjour,
J'aimerais savoir si quelqu'un connait un moyen (préexistant) pour créer des miniature d'images de type Jpeg.
Merci d'avance ^^
Bonjour,
J'aimerais savoir si quelqu'un connait un moyen (préexistant) pour créer des miniature d'images de type Jpeg.
Merci d'avance ^^
comme ça par exemple
et te voila avec une miniature d'une photo dans un label
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 JLabel photoPreview = new JLabel; File file = new File("toto.jpg"); java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); Image img = toolkit.getImage(file.getPath()); ImageIcon ic = new ImageIcon(img.getScaledInstance(130, 160, Image.SCALE_AREA_AVERAGING)); photoPreview.setIcon(ic); repaint(); pack();
Ensuite pour aller plus loin il te faudra manipuler une BufferedImage afin d'obtenir une réduction uniforme de la taille de l'image et non une taille fixée, mais bon c'est une première approche
Il ne faut JAMAIS utiliser getScaledInstance(). JAMAIS. Cette methode est 20 a 30 fois plus lente que l'autre solution :
La methode Graphics.drawImage() permet de redimensionner l'image grace a la carte graphique. Pour avoir un plus joli resultat tu peux rajouter cela avant le drawImage() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Image imageAReduire = ...; // ... BufferedImage image = new BufferedImage(BufferedImage.TYPE_INT_ARGB, imageAReduire.getWidth(null), imageAReduire.getHeight(null)); Graphics2D g2 = image.createGraphics(); g2.drawImage(imageAReduire, 0, 0, nouvelleLargeur, nouvelleHauteur, null); g2.dispose();
Le resultat ne sera agreable que si ta version reduite de l'image a des dimensions proches de celles d'origine divisees par deux. Si tu reduis plus il faut utiliser une approche proche de la technique du mip mapping :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Et non, cette solution n'est pas vraiment plus lente que celle en une seule etape
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 public static BufferedImage createThumbnail(BufferedImage image, int requestedThumbSize) { float ratio = (float) image.getWidth() / (float) image.getHeight(); int width = image.getWidth(); BufferedImage thumb = image; do { width /= 2; if (width < requestedThumbSize) { width = requestedThumbSize; } BufferedImage temp = new BufferedImage(width, (int) (width / ratio), BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = temp.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.drawImage(thumb, 0, 0, temp.getWidth(), temp.getHeight(), null); g2.dispose(); thumb = temp; } while (width != requestedThumbSize); return thumb; }![]()
Dans ce cas petite question, qu'en est-il de la méthode scale d'AffineTransform (même problèmes de vitesse?)
Quoi qu'il en soit merci bien, je mourrais moins con (enfin c'est un euphémisme) ce soir
Il faudrait que je verifie avec les gars de Java2D mais je suis presque certain que la solution AffineTransform est acceleree materiellement (pour les images). La methode getScaledInstance() fait tout en software.
Bonjour,
J'ai essayé la façon présentée par gfx mais j'ai un problème de type d'image.
J'ai essayé plusieurs formats et j'ai chaque fois la même exception qui revient:Voici le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unknown image type -1
J'ai vérifié, toolkit.getImage(url) ne renvoit pas null
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 URL url = getClass().getResource("applic/ressources/Type1.gif"); java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); Image imageAReduire = toolkit.getImage(url); BufferedImage image = new BufferedImage(BufferedImage.TYPE_INT_RGB, imageAReduire.getWidth(null), imageAReduire.getHeight(null)); Graphics2D g2 = image.createGraphics(); g2.drawImage(imageAReduire, 0, 0, this.getWidth(),this.getHeight(), null); g2.dispose();
Qqun voit le problème?
Merci d'avance
N'utilie pas Toolkit.getImage() mais ImageIO.read(). Toolkit ne garantit pas que l'image est finie de charger en memoire a la fin de l'appel, c'est pour ca que cela ne marche pas. ImageIO lui garantit que l'image est entierement lue.
Gfx > Pour récupérer une image à partir d'un lien imgPath, je fais actuellement ça :
Cela me semble, d'après mes premiers tests sous JProbe être un peu plus rapide que de faire comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Image imgOld = new ImageIcon(imgPath).getImage();
Saurais-tu ce qu'il en est réellement ? Car les résultats fournis par JProbe varient pas mal d'une execution à l'autre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 imageFile = new File(imagePath); BufferedImage imgOld = ImageIO.read(imageFile);
Merci ^^
Partager