调整图片大小以适合 JLabel

Posted

技术标签:

【中文标题】调整图片大小以适合 JLabel【英文标题】:Resize a picture to fit a JLabel 【发布时间】:2013-04-26 22:10:08 【问题描述】:

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

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

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

【问题讨论】:

看这个例子也许可以帮助你[在此处输入链接描述][1] [1]:***.com/questions/14548808/… 【参考方案1】:

大纲

以下是要遵循的步骤。

将图片作为 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);

【讨论】:

如果JLabel随窗口调整大小,是否可以为resize事件分配一些回调,使窗口变小时图像不会溢出? @Tomáš Zato:是的,您可以使用ComponentListener 监控 JFrame 的大小。 当我尝试这个时,img.getScaledInstance 结果无法分配给BufferedImage,因为它是一个Image 对象。 label.widthlabel.height 也只是整数的占位符吗? 我将 BufferedImage dimg = img.getScaledInstance(..) 更改为 Image dimg = img.getScaledInstance() 以解决上面 cmets 中提到的问题。 getScaledInstance 函数将在您为宽度或高度传递负值时保持图像的纵横比。【参考方案2】:

你可以试试:

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

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

【讨论】:

【参考方案3】:
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;

【讨论】:

“label.getWidth()”中的标签是从哪里来的?【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

我已经完成了以下操作,效果很好

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) 
     

【讨论】:

getScaledInstance (with, with, with) 不可能是对的【参考方案6】:

或者你可以这样做。你放下面 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;

【讨论】:

【参考方案7】:
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.");
    

【讨论】:

在堆栈溢出时通常会感谢一些解释。 您仍然可以编辑您的帖子并添加一些解释。您可以在您的回答帖子下方找到edit link。【参考方案8】:

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

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

【讨论】:

以上是关于调整图片大小以适合 JLabel的主要内容,如果未能解决你的问题,请参考以下文章

调整图像大小并使其适合画布大小

如何水平调整图像大小(通过 CSS)以适合框?

使用 CSS 调整图像大小以适合容器

水平图像滚动,图像大小调整以适合高度显示空白空间

调整大小以适合 div 中的图像,并水平和垂直居中

如何调整 uiimageview 的大小以仅适合 aspectfill 中的图像?