web-dev-qa-db-fra.com

Redimensionner une image pour l'adapter à un JLabel

J'essaie de faire en sorte qu'une image corresponde à un JLabel. Je souhaite réduire les dimensions de l’image à quelque chose de plus approprié pour mon Swan JPanel. 

J'ai essayé avec setPreferredSize mais cela ne fonctionne pas.

Je me demande s'il existe un moyen simple de le faire? Devrais-je redimensionner l'image à cette fin?

24
user1680212

Contour

Voici les étapes à suivre.

  • Lisez la photo comme une image tamponnée.
  • Redimensionnez BufferedImage en une autre BufferedImage de la taille du JLabel.
  • Créez un ImageIcon à partir de la BufferedImage redimensionnée.

Il n'est pas nécessaire de définir la taille préférée du JLabel. Une fois que vous avez redimensionné l'image à la taille souhaitée, le JLabel prendra la taille d'ImageIcon.

Lire la photo en tant qu'image tamponnée

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}

Redimensionner la BufferedImage

Image dimg = img.getScaledInstance(label.getWidth(), label.getHeight(),
        Image.SCALE_SMOOTH);

Assurez-vous que la largeur et la hauteur de l'étiquette ont les mêmes proportions que la largeur et la hauteur de l'image d'origine. En d'autres termes, si l'image est de 600 x 900 pixels, redimensionnez à 100 x 150. Sinon, votre image sera déformée.

Créer un ImageIcon

ImageIcon imageIcon = new ImageIcon(dimg);
56

Tu peux l'essayer:

ImageIcon imageIcon = new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT));
label.setIcon(imageIcon);

Ou en 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 Fichier et ImageIO.

Je vous recommande de comparer les deux solutions en boucle.

23
Tirz

La méthode la plus simple et la plus simple pour redimensionner une image à l'aide de Java Swing est la suivante:

jLabel.setIcon(new ImageIcon(new javax.swing.ImageIcon(getClass().getResource("/res/image.png")).getImage().getScaledInstance(200, 50, Image.SCALE_SMOOTH)));

Pour un meilleur affichage, identifiez la hauteur et la largeur réelles de l'image et redimensionnez-les en fonction du pourcentage largeur/hauteur.

4
Renjith Thomas
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
amr foda

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
shexaMartin
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
pettlaurence

Ou tu peux le faire de cette façon. La fonction u mettre les 6 lignes ci-dessous lève une exception IOException Et prendra votre JLabel en 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;

Assignez votre image à une chaîne . Par exemple, imageMaintenant, définissez l'icône sur un labe de taille fixe.

image.setIcon (nouveau javax.swing.ImageIcon (image.getScaledInstance (50,50, WIDTH)));

0
muabal