es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recorte/zoom de imagen en Java Swing

Cuando intento renderizar una imagen “png” en Java Swing, se recorta/se acerca en todos los lados. Aquí está mi código:

this.setSize(500, 500);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.getGraphics().drawImage(getImage("RUTA DE LA IMAGEN"), 0, 0, this);

Y esta es mi función “getImage”:

public static Image getImage(String path) {
        File file = new File(path);
        try {
             return ImageIO.read(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

La imagen que quiero renderizar es de 500×500, al igual que mi marco, pero sigue saliendo mal. Esto también se aplica cuando uso la función de esta manera:

Image image = getImage("Ruta de la imagen");
assert image != null;
JLabel picLabel = new JLabel(new ImageIcon(image));

Aquí hay una de las imágenes que estoy intentando renderizar:

Imagen

Aquí está el resultado:

Resultado

Es un poco difícil de ver en este ejemplo, pero el suelo debería estar más bajo y los árboles más altos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema podría estar relacionado con la relación de aspecto de la imagen, lo cual podría hacer que se corte o se acerque cuando se renderiza en el marco de 500×500. Para solucionar esto, puedes intentar establecer el tamaño preferido del panel que contiene el JLabel al tamaño de la imagen, y luego agregar el panel al marco:

    Image image = getImage("Ruta de la imagen");
    assert image != null;
    JPanel picPanel = new JPanel();
    picPanel.setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
    picPanel.add(new JLabel(new ImageIcon(image)));
    this.add(picPanel);
    this.pack();
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    

    Este código crea un JPanel con el tamaño preferido establecido a las dimensiones de la imagen, agrega un JLabel que contiene la imagen al panel, y luego agrega el panel al marco. La función pack() establece el tamaño del marco para ajustarse a su contenido (en este caso, el panel que contiene la imagen).

    Alternativamente, puedes intentar usar el método Image.getScaledInstance() para redimensionar la imagen antes de renderizarla:

    Image image = getImage("Ruta de la imagen");
    assert image != null;
    int newWidth = 500;
    int newHeight = 500;
    Image scaledImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
    JLabel picLabel = new JLabel(new ImageIcon(scaledImage));
    this.add(picLabel);
    this.pack();
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    

    Este código crea un nuevo objeto Image que es una instancia escalada de la imagen original, utilizando la sugerencia Image.SCALE_SMOOTH para producir un resultado de escalado suave. La imagen escalada se utiliza luego para crear un JLabel, que se agrega al marco. Nuevamente, se utiliza la función pack() para establecer el tamaño del marco para que se ajuste a su contenido.

Comments are closed.