Creo que la pregunta es bastante auto-explicativo. Quiero implementar una simple función de zoom utilizando un JSlider como en la Galería Fotográfica de Windows Live, por ejemplo.

He tenido un rápido vistazo por internet, pero todo el código que he probado para uso parece haber errores cuando lo copio en Eclipse. Yo realmente no desea utilizar una librería de terceros, ya sea como la aplicación puede ser vendido bajo el nombre de la compañía. Además, estoy empezando a darme cuenta de que no pueden ser algunas de las precauciones de seguridad necesarias para evitar errores, pero yo no sé de qué se trata.

Así que, si alguien puede proporcionarme con código de Java para acercar y alejar el zoom de las imágenes sería muy apreciado.

P. S. I plan de uso de la Imagen como un ImageIcon dentro de un JLabel que se sumarán a un JScrollPane.

InformationsquelleAutor Andy | 2012-02-18

2 Comentarios

  1. 9

    Usted puede lograr esto mediante el uso de la escala se transforma en la imagen original.
    Asumiendo que tu la anchura de la imagen actual newImageWidth, y la imagen actual de la altura de newImageHeight, y el nivel de zoom actual zoomLevel, puede hacer lo siguiente:

    int newImageWidth = imageWidth * zoomLevel;
    int newImageHeight = imageHeight * zoomLevel;
    BufferedImage resizedImage = new BufferedImage(newImageWidth , newImageHeight, imageType);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, newImageWidth , newImageHeight , null);
    g.dispose();

    Ahora, reemplazar la imagen original, originalImage, en su área de visualización por resizedImage.

    • Gracias GETah, yo ya tenía un método para hacer esto en mi código, simplemente no haga clic en con el que me podría servir para este perpose así, pero como sólo he probado – es obvio que puede!
    • Ah espera, este método parece ser que afecta a la transparencia de la imagen (el transparente bits son de color negro), ¿tiene usted alguna idea de por qué y cómo resolver el problema?
    • Parece que el uso de AffineTransform debe preservar la transparencia de la imagen… mira esto stackoverflow.com/a/2176977/782719
  2. 2

    También se puede utilizar de la siguiente manera
    :

    public class ImageLabel extends JLabel{
        Image image;
        int width, height;
    
        public void paint(Graphics g) {
            int x, y;
            //this is to center the image
            x = (this.getWidth() - width) < 0 ? 0 : (this.getWidth() - width);
            y = (this.getHeight() - width) < 0 ? 0 : (this.getHeight() - width);
    
            g.drawImage(image, x, y, width, height, null);
        }
    
        public void setDimensions(int width, int height) {
            this.height = height;
            this.width = width;
    
            image = image.getScaledInstance(width, height, Image.SCALE_FAST);
            Container parent = this.getParent();
            if (parent != null) {
                parent.repaint();
            }
            this.repaint();
        }
    }

    Entonces usted puede poner a su marco y con el método que se acerca con un factor de zoom, para lo cual he utilizado los valores de porcentaje.

    public void zoomImage(int zoomLevel ){
        int newWidth, newHeight, oldWidth, oldHeight;
        ImagePreview ip = (ImagePreview) jLabel1;
        oldWidth = ip.getImage().getWidth(null);
        oldHeight = ip.getImage().getHeight(null);
    
        newWidth = oldWidth * zoomLevel/100;
        newHeight = oldHeight * zoomLevel/100;
    
        ip.setDimensions(newHeight, newWidth);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here