Rumah >Java >javaTutorial >Bagaimana untuk Menskalakan Imej dalam JLabel dengan Cekap untuk Sesuai atau Mengisi Dimensinya?

Bagaimana untuk Menskalakan Imej dalam JLabel dengan Cekap untuk Sesuai atau Mengisi Dimensinya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-30 21:15:16218semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn