缩放后的 BufferedImage 黑白

BufferedImage black and white after scaling

缩放国旗的 BufferdImages 后,大约 50% 的国旗以黑白(非灰度)显示,很少看起来很奇怪,比如土耳其国旗:

这是一个黑白示例

这里我设置了flag

protected void updateFlag(BufferedImage flag){
    int height = pnlFlag.getHeight();
    int width = (int)(1f * flag.getWidth() / flag.getHeight() * height);
    BufferedImage scaledFlag = new BufferedImage(width, height, flag.getType());

    Graphics2D g2d = scaledFlag.createGraphics();
    g2d.drawImage(flag, 0, 0, scaledFlag.getWidth(), scaledFlag.getHeight(), null);
    g2d.dispose();

    pnlFlag.flag = scaledFlag;
    pnlFlag.repaint();
}

还有我的 JPanel

class FlagPanel extends JPanel{

    private BufferedImage flag;

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        if(flag == null) return;

        g.drawImage(flag, 0, 0, null);
    }

}

我很确定您不能只更改缓冲图像的高度和宽度,它会自动缩放。 尝试像 question.

中那样使用 getScaledInstance()

下面的代码工作正常,但是您需要调用 repaint 方法,因为 getScaledInstance 方法需要时间来生成缩放图像。

    public class Main extends JFrame {

    private ImageIcon ico;
    private boolean resize = true;
    private Image scale;

    public Main() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        ico = new ImageIcon("image.jpg");
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        Graphics2D gg = (Graphics2D) g;

        if (!resize) {
            g.drawImage(ico.getImage(), 0, 0, null);

        } else {
            if (scale == null) {
                scale = ico.getImage().getScaledInstance(ico.getIconWidth() / 2, ico.getIconHeight() / 2, Image.SCALE_SMOOTH);
            }

            g.drawImage(scale, 0, 0, null);

            // gg.scale(0.5, 0.5);
            // gg.drawImage(ico.getImage(), 0, 0, null);
        }

    }

    public static void main(String[] args) {
        Main m = new Main();
        m.setSize(600, 600);
        m.setVisible(true);

    }

}