Java中调整图片大小的方法getScaledInstance

11

这是我的代码

ImageIcon ii=new ImageIcon("/Users/tushar_chutani/Desktop/apple.jpg");  

Image image= ii.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);

图片没有缩放,代码有什么问题?


2
你遇到了什么错误?你能够显示原始的ImageIcon吗?你怎么知道它没有缩放?根据你发布的两行代码,你并没有对图像进行任何操作。请发布一个SSCCE来演示这个问题。 - camickr
1
图片没有显示...图片变成了白色... - Tushar Chutani
2
那么可能是它没有读取图片。您没有发布一个 SSCCE,因此我们无法为您做更多的事情。 - camickr
1
它能与另一张图片一起使用吗?这里有一些关于某些JPEG的问题报告,由于它们的颜色模型。 - Snicolas
1
它也无法与其他文件一起工作。 - Tushar Chutani
3个回答

18
问题在于Image.getScaledInstance()并没有返回完成的、已经缩放好的图像。它留下了很多缩放工作供以后使用图像像素时进行。 例如,如果您在Graphics2D.drawImage()调用中使用缩放后的图像,则该方法将返回false并继续异步绘制。然后,您需要在Graphics2D.drawImage()调用中使用ImageObserver参数来等待缩放和绘制完成。 以下示例展示了如何更简单地缩放图像,而无需使用ImageObserver。这是通过将图标绘制到BufferedImage中来完成的。
import javax.swing.ImageIcon;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.File;
import javax.imageio.ImageIO;
import java.awt.RenderingHints;

public class Tushar2
{
        public void scaleImage()
        {
                try
                {
                        ImageIcon ii = new ImageIcon("/tmp/apple.jpg");
                        BufferedImage bi = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB);
                        Graphics2D g2d = (Graphics2D)bi.createGraphics();
                        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,
                                RenderingHints.VALUE_RENDER_QUALITY));
                        boolean b = g2d.drawImage(ii.getImage(), 0, 0, 50, 50, null);
                        System.out.println(b);
                        ImageIO.write(bi, "jpg", new File("/tmp/apple50.jpg"));
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }

        public static void main(String []args)
        {
                new Tushar2().scaleImage();
        }
}

7

您可以再次将图像包装在图像图标中。 图像图标通常在其构造函数中加载图像,并使用自己的媒体跟踪器来完成此操作。我现在正在使用以下代码:

     Image image = icon.getImage().getScaledInstance(
          icon.getIconWidth() * NEW / OLD,
          icon.getIconHeight() * NEW / OLD,
          Image.SCALE_SMOOTH);
     icon = new ImageIcon(image, icon.getDescription());

您可以直接使用新图标,或调用getImage()来使用新图像。上述代码还提供了一种基于某些NEW和OLD对进行宽高比保持缩放的方法。

再见


1
这个被接受的答案很好,但我认为这个答案更容易理解,感谢您的见解! - Kcits970

1

你的代码:

ImageIcon ii=new 
ImageIcon("/Users/tushar_chutani/Desktop/apple.jpg");  

添加这个:

加入这个

Image image= ii.getImage().getScaledInstance(50, 50, 
Image.SCALE_SMOOTH);
ii=new ImageIcon(image);

如果你想显示: 添加这个...
jLabel1.setIcon(ii);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接