首頁 >Java >java教程 >如何有效地縮放 JLabel 中的圖像以適合或填滿其尺寸?

如何有效地縮放 JLabel 中的圖像以適合或填滿其尺寸?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-30 21:15:16218瀏覽

How to Efficiently Scale Images in a JLabel to Fit or Fill its Dimensions?

JLabel 的自動影像縮放

使用 JLabel 在 JFrame 中顯示影像時,可能會遇到影像大小不一致的情況。要在 JLabel 中統一縮放和適合圖像,您可以利用以下方法。

避免使用 getScaledInstance

雖然 Image.getScaledInstance 是常見選擇,但它不是最有效或最高品質的選擇。相反,可以創建自訂組件來提高速度和影像清晰度。

確定縮放方法

您可以靈活地選擇縮放方法,無論您是想要使用「toFit」保持寬高比或使用「toFill」完全填充可用空間。

自訂可縮放影像的組件

下面的自訂元件ScalablePane允許您設定縮放模式並根據標籤的尺寸自動調整圖片大小。

public class ScalablePane extends JPanel {
    // Scaled image
    private Image scaled;
    // Scaling mode: fit or fill
    private boolean toFit;

    // Constructor with image and scaling mode
    public ScalablePane(Image master, boolean toFit) {
        this.toFit = toFit;
        generateScaledInstance(); // Initial scaling
    }

    // Override getPreferredSize to return master image size
    @Override
    public Dimension getPreferredSize() {
        return master == null ? super.getPreferredSize() : new Dimension(master.getWidth(this), master.getHeight(this));
    }

    // Override paintComponent to draw the scaled image
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(scaled, 0, 0, this); 
    }

    // Generate the scaled image based on the scaling mode
    protected void generateScaledInstance() {
        if (isToFit()) {
            scaled = getScaledInstanceToFit(master, getSize());
        } else {
            scaled = getScaledInstanceToFill(master, getSize());
        }
    }

    // Generate toFit image
    protected Image getScaledInstanceToFit(Image master, Dimension size) {
        Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));
        return getScaledInstance(master, getScaleFactorToFit(masterSize, size));
    }

    // Generate toFill instance 
    protected Image getScaledInstanceToFill(Image master, Dimension size) {
        Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));
        return getScaledInstance(master, getScaleFactorToFill(masterSize, size));
    }

    // Actual scaling logic
    protected Image getScaledInstance(Image master, double scaleFactor) {
        BufferedImage img = toBufferedImage(master);
        return getScaledInstance(img, scaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
    }
    // ... additional helper methods and utility functions omitted for brevity
}

如何使用

要使用此方法,請使用您想要的建立一個ScalablePane 實例映像和縮放模式,將其新增至標籤中,然後設定標籤的首選尺寸。自訂組件將根據需要自動縮放和顯示影像。

ImageIcon img = new ImageIcon("res.png");
JLabel label = new JLabel(img);
label.setPreferredSize(new Dimension(200, 100));
label.add(new ScalablePane(img, true));

透過利用此自訂元件,您可以實現自動高效的圖像縮放以匹配 JLabel 的尺寸,從而確保一致的圖像表示,無論如何它的原始大小。

以上是如何有效地縮放 JLabel 中的圖像以適合或填滿其尺寸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn