Rumah >Java >javaTutorial >Bagaimana untuk Menskalakan Imej dalam JLabel dengan Cekap untuk Sesuai atau Mengisi Dimensinya?
Penskalaan Imej Automatik untuk JLabel
Apabila memaparkan imej dalam JFrame menggunakan JLabel, anda mungkin menghadapi situasi di mana saiz imej tidak konsisten. Untuk menskalakan dan menyesuaikan imej secara seragam dalam JLabel, anda boleh memanfaatkan pendekatan berikut.
Elakkan Menggunakan getScaledInstance
Walaupun Image.getScaledInstance ialah pilihan biasa, itu bukan pilihan yang paling cekap atau berkualiti tinggi. Sebaliknya, komponen tersuai boleh dibuat untuk meningkatkan kedua-dua kelajuan dan kejelasan imej.
Tentukan Kaedah Penskalaan
Anda mempunyai fleksibiliti untuk memilih kaedah penskalaan, sama ada anda ingin mengekalkan nisbah bidang dengan "toFit" atau mengisi sepenuhnya ruang yang tersedia dengan "toFill."
Komponen Tersuai untuk Imej Boleh Skala
Komponen tersuai berikut, ScalablePane, membolehkan anda menetapkan mod penskalaan dan melaraskan saiz imej secara automatik berdasarkan dimensi label.
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 }
Cara untuk Gunakan
Untuk menggunakan pendekatan ini, buat contoh ScalablePane dengan imej dan mod penskalaan yang anda inginkan, tambahkannya pada label anda dan kemudian tetapkan saiz label pilihan. Komponen tersuai akan menskala dan memaparkan imej secara automatik mengikut keperluan.
ImageIcon img = new ImageIcon("res.png"); JLabel label = new JLabel(img); label.setPreferredSize(new Dimension(200, 100)); label.add(new ScalablePane(img, true));
Dengan memanfaatkan komponen tersuai ini, anda boleh mencapai penskalaan imej automatik dan cekap untuk memadankan dimensi JLabel anda, memastikan perwakilan imej yang konsisten tanpa mengira saiz asalnya.
Atas ialah kandungan terperinci Bagaimana untuk Menskalakan Imej dalam JLabel dengan Cekap untuk Sesuai atau Mengisi Dimensinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!