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中文網其他相關文章!