ホームページ >Java >&#&チュートリアル >JLabel 内の画像をその寸法に合わせて効率的に拡大縮小する方法は?
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 サイトの他の関連記事を参照してください。