Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调整图片大小以适合JLabel_Java_Swing_Jlabel - Fatal编程技术网

Java 调整图片大小以适合JLabel

Java 调整图片大小以适合JLabel,java,swing,jlabel,Java,Swing,Jlabel,我在试着让一张照片适合一张桌子。我希望减少图片的尺寸,使之更适合我的Swing JPanel 我尝试使用setPreferredSize,但它不起作用 我想知道有没有简单的方法?我应该为此缩放图像吗?Outline 以下是要遵循的步骤 以缓冲图像的形式阅读图片 将BuffereImage调整为另一个与JLabel大小相同的BuffereImage 从调整大小的BuffereImage创建图像图标 您不必设置JLabel的首选大小。将图像缩放到所需大小后,JLabel将采用图像图标的大小 以缓

我在试着让一张照片适合一张桌子。我希望减少图片的尺寸,使之更适合我的Swing JPanel

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

我想知道有没有简单的方法?我应该为此缩放图像吗?

Outline 以下是要遵循的步骤

  • 以缓冲图像的形式阅读图片
  • 将BuffereImage调整为另一个与JLabel大小相同的BuffereImage
  • 从调整大小的BuffereImage创建图像图标
您不必设置JLabel的首选大小。将图像缩放到所需大小后,JLabel将采用图像图标的大小

以缓冲图像的形式阅读图片 调整BuffereImage的大小 确保标签宽度和高度与原始图像宽度和高度的比例相同。换句话说,如果图片是600 x 900像素,则缩放到100 x 150。否则,您的图片将被扭曲

创建一个图像图标
或者你可以这样做。函数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.");
    }
}