java实现图片中心放大、缩小、移动、鼠标拖移
时间: 2023-08-05 11:06:36 浏览: 117
java图片放大与缩小
要实现图片中心放大、缩小、移动、鼠标拖移,可以使用Java的图形库,例如Java AWT和Java Swing。
下面是一个简单的实现代码示例:
```java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ImageZoomPan extends JPanel implements MouseListener, MouseMotionListener, MouseWheelListener {
private static final long serialVersionUID = 1L;
private BufferedImage image;
private double scale = 1;
private double xOffset = 0;
private double yOffset = 0;
private Point lastDragPoint;
public ImageZoomPan(BufferedImage image) {
this.image = image;
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.addMouseWheelListener(this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension((int) (image.getWidth() * scale), (int) (image.getHeight() * scale));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
AffineTransform at = new AffineTransform();
at.translate(xOffset, yOffset);
at.scale(scale, scale);
g2d.drawRenderedImage(image, at);
g2d.dispose();
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int notches = e.getWheelRotation();
if (notches < 0) {
scale *= 1.1;
} else {
scale /= 1.1;
}
revalidate();
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
lastDragPoint = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
lastDragPoint = null;
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
if (lastDragPoint != null) {
double dx = e.getX() - lastDragPoint.getX();
double dy = e.getY() - lastDragPoint.getY();
lastDragPoint = e.getPoint();
xOffset += dx / scale;
yOffset += dy / scale;
repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
public static void main(String[] args) throws Exception {
BufferedImage image = ImageIO.read(new File("image.jpg"));
ImageZoomPan panel = new ImageZoomPan(image);
JFrame frame = new JFrame("Image Zoom and Pan");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
```
在这个示例中,我们首先定义了一个 `ImageZoomPan` 类,这个类继承自 `JPanel`,并实现了 `MouseListener`、`MouseMotionListener` 和 `MouseWheelListener` 接口。这个类中定义了一个 `BufferedImage` 类型的 `image` 变量,以及一个 `scale` 变量用于缩放图片,以及 `xOffset` 和 `yOffset` 变量用于移动图片。
在 `paintComponent` 方法中,我们使用 `AffineTransform` 类来对图片进行缩放和平移操作,然后使用 `drawRenderedImage` 方法将图片绘制到面板上。
在 `mouseWheelMoved` 方法中,我们根据鼠标滚轮的滚动方向来调整 `scale` 变量的值,然后重新计算面板的大小,并重新绘制面板。
在 `mousePressed` 和 `mouseDragged` 方法中,我们记录鼠标的位置,并计算出鼠标在面板上移动的距离,然后根据缩放比例来调整 `xOffset` 和 `yOffset` 变量的值,然后重新绘制面板。
最后,我们在 `main` 方法中创建一个 `ImageZoomPan` 面板,并将其添加到一个 `JFrame` 窗口中。我们可以通过调用 `pack` 方法来自动调整窗口的大小,然后将窗口设置为可见状态。
当我们运行这个程序时,就可以看到一张图片在面板中心位置显示,并且可以使用鼠标滚轮来缩放图片,使用鼠标拖动来移动图片。
阅读全文