Zoom in and out of images in Java

前端 未结 2 1790
被撕碎了的回忆
被撕碎了的回忆 2020-12-11 07:03

I think the question is quite self-explanatory. I want to implement a simple zoom function using a JSlider like in Windows Live Photo Gallery for instance.

相关标签:
2条回答
  • 2020-12-11 07:55

    You can also use it as follows :

    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();
        }
    }
    

    Then you can put it to your frame and with the method that zooms with a zooming factor, for which I used percent values.

    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);
    }
    
    0 讨论(0)
  • 2020-12-11 07:57

    You can easily achieve this by using scale transforms on the original image. Assuming your the current image width newImageWidth, and the current image height newImageHeight, and the current zoom level zoomLevel, you can do the following:

    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();
    

    Now, replace the original image, originalImage, in your display area by resizedImage.

    0 讨论(0)
提交回复
热议问题