调整图片大小以适合JLabel

时间:2013-05-02 16:25:48

标签: java swing jlabel

我正在努力使照片适合JLabel。我希望将图片尺寸缩小到更适合我的Swing JPanel的尺寸。

我尝试使用setPreferredSize,但它不起作用。

我想知道是否有一种简单的方法可以做到这一点?我应该为此目的缩放图像吗?

7 个答案:

答案 0 :(得分:58)

概要

以下是要遵循的步骤。

  • 将图片作为BufferedImage阅读。
  • 将BufferedImage的大小调整为另一个大小与JLabel相同的BufferedImage。
  • 从调整大小的BufferedImage创建一个ImageIcon。

您不必设置JLabel的首选大小。将图像缩放到所需大小后,JLabel将采用ImageIcon的大小。

将图片读取为BufferedImage

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

调整BufferedImage的大小

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

确保标签宽度和高度与原始图像宽度和高度的比例相同。换句话说,如果图片为600 x 900像素,则缩放为100 X 150.否则,您的图片将会失真。

创建ImageIcon

ImageIcon imageIcon = new ImageIcon(dimg);

答案 1 :(得分:25)

你可以尝试一下:

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

或者在一行中:

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

执行时间比File和ImageIO快得多。

我建议你在循环中比较两个解决方案。

答案 2 :(得分:4)

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

答案 3 :(得分:4)

使用Java Swing调整图像大小的最佳方法是:

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

为了更好地显示,请确定实际高度和亮度。图像宽度和基于宽度/高度百分比调整大小

答案 4 :(得分:3)

我做了以下工作并且完美地运作了

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) {
    } 

答案 5 :(得分:2)

或者你可以这样做。函数你把下面的6行放到IOException。并将您的JLabel作为参数。

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;

答案 6 :(得分:2)

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.");
    }
}