[英]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.