Maison >Java >javaDidacticiel >Comment redimensionner efficacement les images dans un JLabel pour les adapter ou remplir ses dimensions ?

Comment redimensionner efficacement les images dans un JLabel pour les adapter ou remplir ses dimensions ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-30 21:15:16160parcourir

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

Mise à l'échelle automatique de l'image pour JLabel

Lors de l'affichage d'images dans un JFrame à l'aide d'un JLabel, vous pouvez rencontrer des situations où la taille de l'image est incohérente. Pour redimensionner et ajuster uniformément les images dans JLabel, vous pouvez tirer parti de l'approche suivante.

Évitez d'utiliser getScaledInstance

Bien que Image.getScaledInstance soit un choix courant, ce n'est pas le cas. l’option la plus efficace ou de la plus haute qualité. Au lieu de cela, un composant personnalisé peut être créé pour améliorer à la fois la vitesse et la clarté de l'image.

Déterminez la méthode de mise à l'échelle

Vous avez la possibilité de choisir la méthode de mise à l'échelle, que vous souhaitez conserver les proportions avec "toFit" ou remplir complètement l'espace disponible avec "toFill".

Composant personnalisé pour évolutif Images

Le composant personnalisé suivant, ScalablePane, vous permet de définir le mode de mise à l'échelle et d'ajuster automatiquement la taille de l'image en fonction des dimensions de l'étiquette.

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
}

Comment Utiliser

Pour utiliser cette approche, créez une instance ScalablePane avec l'image et le mode de mise à l'échelle souhaités, ajoutez-la à votre étiquette, puis définissez la taille préférée de l’étiquette. Le composant personnalisé mettra automatiquement à l'échelle et affichera l'image si nécessaire.

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

En tirant parti de ce composant personnalisé, vous pouvez obtenir une mise à l'échelle automatique et efficace de l'image pour correspondre aux dimensions de votre JLabel, garantissant une représentation cohérente de l'image quel que soit le sa taille originale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn