繁体   English   中英

在 java swing 中调整图像大小

[英]Adjusting image size in java swing

我有一个正在显示的图像,应该显示图像占用 window 的最大可能部分并调整 window 的大小,但同时图像的宽度与其高度的比率应保持不变(不应更改图像纵横比)。

这怎么能做?

这是我编写的代码:

import java.awt.BorderLayout;
import javax.swing.*;
public class ImageShuffle extends JFrame {
JLabel label;
public ImageShuffle(){
    setLayout(new BorderLayout());
    ImageIcon image = new ImageIcon(getClass().getResource("TOKYO.gif"));
    label = new JLabel(image);
    this.add(label, BorderLayout.CENTER);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setVisible(true);
}
public static void main(String[] args) {
    new ImageShuffle();
}
}

您可以使用自定义组件执行此操作,就像这样,在覆盖的paintComponent中,为新比例执行所有计算并绘制图像。

此代码示例将显示一个图像,该图像经过缩放以适合组件大小,保持其纵横比,并在超出空间中水平或垂直居中。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class TestAutoResizeImage extends JComponent {
    protected BufferedImage img;
    public TestAutoResizeImage() throws MalformedURLException, IOException {
        img=ImageIO.read(new URL("https://i.imgur.com/dsBJr4C.png"));
    }
    
    @Override
    public Dimension getPreferredSize() {
        //Using image size as preferred size
        return new Dimension(img.getWidth(), img.getHeight());
    }
    
    @Override
    public Dimension getMinimumSize() {
        //Using image size as minimum size
        return new Dimension(img.getWidth(), img.getHeight());
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        //Compute scaling for both axis according to current component size
        //then use the lower value
        double scaleX=getWidth()*1.0/img.getWidth();
        double scaleY=getHeight()*1.0/img.getHeight();
        double scale=Math.min(scaleX, scaleY);

        //Center the image on the axis with greater scale
        double offsetX=(getWidth()-scale*img.getWidth())/2.0;
        double offsetY=(getHeight()-scale*img.getHeight())/2.0;

        Graphics2D g2=(Graphics2D) g.create();

        //This gives a better quality in upscaling, but also slow down the repainting, remove it if the resizing not responsive enough
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        
        //We must consider the current possible transform before applying our scaling
        //Current transform
        AffineTransform at=g2.getTransform();
        //Translate to center
        at.concatenate(AffineTransform.getTranslateInstance(offsetX, offsetY));
        //Scale image
        at.concatenate(AffineTransform.getScaleInstance(scale, scale));
        
        g2.setTransform(at);
        //Paint the transformed image
        g2.drawImage(img, 0, 0, null);
        
        g2.dispose();
    }
    
    public static void main(String[] args) throws MalformedURLException, IOException {
        JFrame frame=new JFrame("Autoresize image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new TestAutoResizeImage());
        frame.pack();
        frame.setVisible(true);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM