首页 > 解决方案 > 缩放图像会在 java.awt.image.ReplicateScaleFilter 处产生错误。(来源不明))

问题描述

我正在尝试缩放图像以使其适合 JLabel 大小,但遇到此错误

at java.awt.image.ReplicateScaleFilter.<init>(Unknown Source)
at java.awt.image.AreaAveragingScaleFilter.<init>(Unknown Source)
at java.awt.Image.getScaledInstance(Unknown Source)
at ma.ensao.Practice.main(Practice.java:49)

这是我正在使用的整个代码

import java.util.*;
import java.io.IOException;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
public class Practice {
public static void main(String[] args) throws IOException{

BufferedImage img = null;
        JLabel label=new JLabel();
        try {
            img = ImageIO.read(new File("med/mido.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Image imgS = img.getScaledInstance(label.getWidth(), label.getHeight(),
                Image.SCALE_SMOOTH);
        ImageIcon imageIcon = new ImageIcon(imgS);
        label.setIcon(imageIcon);

        JPanel p=new JPanel();
        p.add(label);

        JFrame f = new JFrame();
        f.setSize(500,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(p);
        f.setVisible(true);

}

}

我想知道为什么我会收到这个错误?谢谢。

标签: javaswing

解决方案


JLabel label=new JLabel();
System.out.println( label.getSize() );

试试上面的代码。

我猜问题是标签的大小是 (0, 0),所以很难将图像缩放到那个大小。

相反,您应该选择您希望图像的大小,然后获取缩放的实例,然后使用缩放的图像创建标签。

编辑:

每当用户更改窗口的大小时,我想让图像的大小等于标签的大小,

因此,您希望图像的大小能够动态缩放。所以你不能只创建一个初始的缩放图像。

此外,您不能将 JLabel 添加到 JPanel,然后将面板添加到框架,因为 JPanel 的默认布局管理器是 FlowLayout,它将始终尊重标签的首选大小。

所以你有几个选择:

  1. 在 JPanel 上进行自定义绘画。在该方法中,您将使用JPanel的和方法paintCompononent(...)获取面板的当前大小。然后您将使用该类的方法来绘制图像。然后将此自定义面板直接添加到框架中,以允许面板动态调整大小。阅读有关自定义绘画的 Swing 教程以获取更多信息和工作示例以帮助您入门。getWidth()getHeight()drawImage(...)GraphicsBorderLayout.CENTER

  2. 使用拉伸图标。这是一个允许图标动态调整大小的自定义类。因此,您将JLabel使用创建StretchIcon然后将标签添加到BorderLayout.CENTER框架的。


推荐阅读