【问题标题】:Resize a picture to fit a JLabel调整图片大小以适合 JLabel
【发布时间】:2021-07-20 21:04:42
【问题描述】:

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

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

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

【问题讨论】:

标签: java swing jlabel


【解决方案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)));
        

        【讨论】:

          猜你喜欢
          • 2013-10-12
          • 2014-05-05
          • 2020-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-07
          • 2012-05-24
          相关资源
          最近更新 更多