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?

20
demandé sur Gilbert Le Blanc 2013-05-02 20:25:47

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);
49
répondu Gilbert Le Blanc 2017-07-10 14:29:10

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.

23
répondu Tirz 2015-10-01 11:02:52
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;
}
4
répondu amr foda 2017-06-08 10:24:05

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) {
    } 
3
répondu shexaMartin 2015-04-23 12:07:53

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

3
répondu Renjith Thomas 2017-01-30 07:26:18

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;
2
répondu Aditya Rameshwarpratap Singh 2014-01-03 07:10:50
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.");
    }
}
2
répondu pettlaurence 2017-09-13 01:45:40

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));

0
répondu muabal 2015-08-26 14:37:55