36

我正在尝试使图片适合 JLabel。我希望将图片尺寸减小到更适合我的 Swing JPanel 的尺寸。

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

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

4

8 回答 8

77

大纲

以下是要遵循的步骤。

  • 将图片作为 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);
于 2013-05-02T19:14:11.857 回答
36

你可以试试:

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 快得多。

我建议您循环比较这两种解决方案。

于 2015-10-01T11:02:52.863 回答
6
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;
}
于 2015-12-09T01:12:24.467 回答
5

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

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

为了更好的显示,确定图像的实际高度和宽度,并根据宽度/高度百分比调整大小

于 2016-04-28T00:03:02.107 回答
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) {
    } 
于 2015-04-23T12:07:53.307 回答
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;
于 2013-12-13T10:15:31.480 回答
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.");
    }
}
于 2017-09-12T09:14:17.967 回答
0

将您的图像分配给一个字符串。例如图像 现在将图标设置为固定大小的标签。

image.setIcon(new javax.swing.ImageIcon(image.getScaledInstance(50,50,WIDTH)));
于 2015-08-26T14:37:55.847 回答