Heim >Java >javaLernprogramm >Wie skaliert man Bilder in einem JLabel effizient, um sie an die Abmessungen anzupassen oder auszufüllen?

Wie skaliert man Bilder in einem JLabel effizient, um sie an die Abmessungen anzupassen oder auszufüllen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 21:15:16154Durchsuche

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

Automatische Bildskalierung für JLabel

Bei der Anzeige von Bildern in einem JFrame mithilfe eines JLabel kann es zu Situationen kommen, in denen die Bildgröße inkonsistent ist. Um die Bilder gleichmäßig zu skalieren und in das JLabel einzupassen, können Sie den folgenden Ansatz nutzen.

Vermeiden Sie die Verwendung von getScaledInstance

Image.getScaledInstance ist zwar eine häufige Wahl, ist es aber nicht die effizienteste oder hochwertigste Option. Stattdessen kann eine benutzerdefinierte Komponente erstellt werden, um sowohl die Geschwindigkeit als auch die Bildschärfe zu verbessern.

Bestimmen Sie die Skalierungsmethode

Sie haben die Flexibilität, die Skalierungsmethode zu wählen, unabhängig davon, ob Sie möchten Sie möchten das Seitenverhältnis mit „toFit“ beibehalten oder den verfügbaren Platz mit „toFill“ vollständig ausfüllen.

Benutzerdefinierte Komponente für Scalable Bilder

Mit der folgenden benutzerdefinierten Komponente, ScalablePane, können Sie den Skalierungsmodus festlegen und die Bildgröße basierend auf den Abmessungen des Etiketts automatisch anpassen.

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
}

Anleitung Verwenden Sie

Um diesen Ansatz zu verwenden, erstellen Sie eine ScalablePane-Instanz mit dem gewünschten Bild und Skalierungsmodus und fügen Sie sie zu Ihrem hinzu Wählen Sie das Etikett aus und legen Sie dann die gewünschte Größe des Etiketts fest. Die benutzerdefinierte Komponente skaliert das Bild automatisch und zeigt es nach Bedarf an.

ImageIcon img = new ImageIcon("res.png");
JLabel label = new JLabel(img);
label.setPreferredSize(new Dimension(200, 100));
label.add(new ScalablePane(img, true));

Durch die Nutzung dieser benutzerdefinierten Komponente können Sie eine automatische und effiziente Bildskalierung erreichen, um sie an die Abmessungen Ihres JLabels anzupassen und so unabhängig davon eine konsistente Bilddarstellung sicherzustellen seine ursprüngliche Größe.

Das obige ist der detaillierte Inhalt vonWie skaliert man Bilder in einem JLabel effizient, um sie an die Abmessungen anzupassen oder auszufüllen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn