Java 调整图片大小以适合JLabel
我在试着让一张照片适合一张桌子。我希望减少图片的尺寸,使之更适合我的Swing JPanel 我尝试使用setPreferredSize,但它不起作用 我想知道有没有简单的方法?我应该为此缩放图像吗?Outline 以下是要遵循的步骤Java 调整图片大小以适合JLabel,java,swing,jlabel,Java,Swing,Jlabel,我在试着让一张照片适合一张桌子。我希望减少图片的尺寸,使之更适合我的Swing JPanel 我尝试使用setPreferredSize,但它不起作用 我想知道有没有简单的方法?我应该为此缩放图像吗?Outline 以下是要遵循的步骤 以缓冲图像的形式阅读图片 将BuffereImage调整为另一个与JLabel大小相同的BuffereImage 从调整大小的BuffereImage创建图像图标 您不必设置JLabel的首选大小。将图像缩放到所需大小后,JLabel将采用图像图标的大小 以缓
- 以缓冲图像的形式阅读图片
- 将BuffereImage调整为另一个与JLabel大小相同的BuffereImage
- 从调整大小的BuffereImage创建图像图标
或者你可以这样做。函数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;
我已经完成了以下工作,效果非常好
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) {
}
将图像指定给字符串。 Eg图像 现在将图标设置为固定大小的标签
image.setIcon(新的javax.swing.ImageIcon(image.getScaledInstance(50,50,宽度));
您可以尝试:
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)));
执行时间比文件和图像IO快得多
我建议您在一个循环中比较这两种解决方案。使用Java Swing调整图像大小的最佳且简单的方法是:
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;
}
为了更好地显示图像,请确定图像的实际高度和宽度,并根据宽度/高度百分比调整大小如果JLabel随窗口调整大小,我是否可以为调整大小事件分配一些回调,以便在窗口变小时图像不会溢出?@TomášZato:是的,您可以使用,
img.getScaledInstance
结果无法分配给BuffereImage
,因为它是一个Image
对象。还有label.width
和label.height
只是整数的占位符?我将buffereImage dimg=img.GetScaleInstance(..)更改为Image dimg=img.GetScaleInstance()若要修复上述评论中提到的问题,getScaledInstance
函数将在传递宽度或高度的负值时保持图像的纵横比。请参阅此示例,mayby可以帮助您[在此处输入链接说明][1][1]:在堆栈溢出时,通常会欣赏一些解释性的文字。您仍然可以编辑您的帖子并添加一些解释。你可以在你的答案帖子下面找到正确的答案。getScaledInstance(with、with、with)不可能是正确的
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.");
}
}
label.setIcon(new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT)));
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;
}
jLabel.setIcon(new ImageIcon(new javax.swing.ImageIcon(getClass().getResource("/res/image.png")).getImage().getScaledInstance(200, 50, Image.SCALE_SMOOTH)));
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.");
}
}