调整图片大小以适合JLabel

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

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

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

大纲

以下是要遵循的步骤。

  • 将图片作为BufferedImage读取。
  • 将BufferedImage的大小调整为另一个大小与JLabel相同的BufferedImage。
  • 从resize的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); 

你可以尝试一下:

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

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

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

我做了以下工作,它完美地工作

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

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

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

为了更好地显示,请确定图像的实际高度和宽度,并根据宽度/高度百分比resize

或者你可以这样做。 函数u放在下面的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; 
 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."); } } 

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

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