【问题标题】:resizing image java getScaledInstance调整图像大小 java getScaledInstance
【发布时间】:2011-08-31 05:40:08
【问题描述】:

这是我的代码”

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

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

图像没有被缩放代码有什么问题?

【问题讨论】:

  • 您遇到了什么错误?你真的可以显示原始的 ImageIcon 吗?你怎么知道不是缩放。根据您发布的两行代码,您不会对图像做任何事情。发布您的 SSCCE 来证明问题。
  • 图像未显示...图像变为白色...
  • 那么它可能没有读取图像。您没有发布 SSCCE,因此我们无能为力。
  • 它是否适用于其他图像。由于颜色模型,此处报告了一些 jpeg 的一些问题。
  • 它也不适用于任何其他文件

标签: java image


【解决方案1】:

问题是Image.getScaledInstance() 没有返回一个 完成,缩放图像。它将大部分缩放工作留给以后 使用图像像素的时间。

例如,如果您在 Graphics2D.drawImage() 中使用缩放图像 调用然后该方法将返回 false 并继续异步绘制。然后你必须使用ImageObserver Graphics2D.drawImage()调用中的参数等待缩放和绘制完成。

以下示例显示了如何更简单地缩放图像 没有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();
        }
}

【讨论】:

    【解决方案2】:

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

         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 对进行了纵横比保持缩放。

    再见

    【讨论】:

    • 接受的答案效果很好,但我认为这个答案更容易理解,感谢您的洞察力!
    【解决方案3】:

    您的代码:

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

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2011-10-26
      • 2015-02-10
      • 1970-01-01
      相关资源
      最近更新 更多