ホームページ >Java >&#&チュートリアル >JLabel 内の画像をその寸法に合わせて効率的に拡大縮小する方法は?

JLabel 内の画像をその寸法に合わせて効率的に拡大縮小する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-30 21:15:16195ブラウズ

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 のサイズに関係なく一貫した画像表現が保証されます。元のサイズです。

以上がJLabel 内の画像をその寸法に合わせて効率的に拡大縮小する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。