Redimensionner une image pour l'adapter à un JLabel
j'essaie de faire une photo qui corresponde à un JLabel. Je souhaite réduire les dimensions de l'image à quelque chose de plus approprié pour mon Swing JPanel.
j'ai essayé avec setPreferredSize mais ça ne marche pas.
je me demande s'il y a une façon simple de le faire? Dois-je dimensionner l'image à cette fin?
8 réponses
Plan
Voici les étapes à suivre.
- Lire l'image comme un BufferedImage.
- redimensionne le tampon à un autre tampon de la taille du JLabel.
- créer un ImageIcon à partir du tampon redimensionné.
vous n'avez pas à définir la taille préférée du JLabel. Une fois que vous avez redimensionné l'image à la taille que vous voulez, le JLabel prendra la taille de L'ImageIcon.
Lire l'image comme un BufferedImage
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
redimensionner le tampon
Image dimg = img.getScaledInstance(label.getWidth(), label.getHeight(),
Image.SCALE_SMOOTH);
s'assurer que la hauteur et la largeur de l'étiquette sont les mêmes proportions que la hauteur et la largeur de l'image originale. En d'autres termes, si l'image est de 600 x 900 pixels, échelle à 100 X 150. Sinon, votre image sera déformée.
créer un ImageIcon
ImageIcon imageIcon = new ImageIcon(dimg);
Vous pouvez essayer:
ImageIcon imageIcon = new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT));
label.setIcon(imageIcon);
ou sur une ligne:
label.setIcon(new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT)));
le temps d'exécution est beaucoup plus rapide que le fichier et L'ImageIO.
je vous recommande de comparer les deux solutions en boucle.
public static void main(String s[])
{
BufferedImage image = null;
try
{
image = ImageIO.read(new File("your image path"));
} catch (Exception e)
{
e.printStackTrace();
}
ImageIcon imageIcon = new ImageIcon(fitimage(image, label.getWidth(), label.getHeight()));
jLabel1.setIcon(imageIcon);
}
private Image fitimage(Image img , int w , int h)
{
BufferedImage resizedimage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedimage.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(img, 0, 0,w,h,null);
g2.dispose();
return resizedimage;
}
j'ai fait ce qui suit et cela a fonctionné parfaitement
try {
JFileChooser jfc = new JFileChooser();
jfc.showOpenDialog(null);
File f = jfc.getSelectedFile();
Image bi = ImageIO.read(f);
image1.setText("");
image1.setIcon(new ImageIcon(bi.getScaledInstance(int width, int width, int width)));
} catch (Exception e) {
}
la meilleure façon de redimensionner une image en utilisant Java Swing est:
jLabel.setIcon(new ImageIcon(new javax.swing.ImageIcon(getClass().getResource("/res/image.png")).getImage().getScaledInstance(200, 50, Image.SCALE_SMOOTH)));
pour un meilleur affichage, identifier la hauteur et la largeur réelles de l'image et redimensionner en fonction du pourcentage de largeur / hauteur
ou vous pouvez le faire de cette façon. La fonction u mettre les 6 lignes ci-dessous lancera une IOException. Et prendra votre JLabel comme paramètre.
BufferedImage bi=new BufferedImage(label.width(),label.height(),BufferedImage.TYPE_INT_RGB);
Graphics2D g=bi.createGraphics();
Image img=ImageIO.read(new File("path of your image"));
g.drawImage(img, 0, 0, label.width(), label.height(), null);
g.dispose();
return bi;
public void selectImageAndResize(){
int returnVal = jFileChooser.showOpenDialog(this); //open jfilechooser
if (returnVal == jFileChooser.APPROVE_OPTION) { //select image
File file = jFileChooser.getSelectedFile(); //get the image
BufferedImage bi;
try {
//
//transforms selected file to buffer
//
bi=ImageIO.read(file);
ImageIcon iconimage = new ImageIcon(bi);
//
//get image dimensions
//
BufferedImage bi2 = new BufferedImage(iconimage.getIconWidth(), iconimage.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
iconimage.paintIcon(null, g, 0,0);
g.dispose();
//
//resize image according to jlabel
//
BufferedImage resizedimage=resize(bi,jLabel2.getWidth(), jLabel2.getHeight());
ImageIcon resizedicon=new ImageIcon(resizedimage);
jLabel2.setIcon(resizedicon);
} catch (Exception ex) {
System.out.println("problem accessing file"+file.getAbsolutePath());
}
}
else {
System.out.println("File access cancelled by user.");
}
}
Assignez votre image à une chaîne. Par exemple l'image Maintenant, réglez l'icône sur un labe de taille fixe.
de l'image.setIcon (new javax.swing.ImageIcon(de l'image.getScaledInstance (50,50,WIDTH));