6
이미지의 특정 영역을 확대하고 싶습니다. 사용자가 선택한 스윙을 사용하여 캔버스에 이미지를 표시합니다. 이미 캔버스에서 전체 이미지 확대/축소를 수행했지만 특정 영역 확대/축소를 구현할 수는 없습니다. 도와주세요스윙에서 캔버스의 특정 이미지 영역을 확대하는 방법
이미지의 특정 영역을 확대하고 싶습니다. 사용자가 선택한 스윙을 사용하여 캔버스에 이미지를 표시합니다. 이미 캔버스에서 전체 이미지 확대/축소를 수행했지만 특정 영역 확대/축소를 구현할 수는 없습니다. 도와주세요스윙에서 캔버스의 특정 이미지 영역을 확대하는 방법
캔버스는 swing
이 아니며 awt
입니다. 대신 JPanel
을 시도하십시오. Example.
이미 전체 이미지 확대/축소를 수행 한 경우 sub-image에서 동일하게 변경하십시오.
BufferedImage.getSubimage(x, y, w, h);
EDIT 답변에 대한
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Example {
private Point startPoint = new Point(0, 0);
private Point rectLocale = new Point();
private Dimension rectSize = new Dimension();
private int zoom = 80;
private BufferedImage capture = null;
private BufferedImage raw;
public Example() throws Exception {
raw = new Robot().createScreenCapture(new Rectangle(
Toolkit.getDefaultToolkit().getScreenSize()));
MouseBehavior behavior = new MouseBehavior();
JPanel b = new JPanel() {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(500, 500);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = ((Graphics2D) g);
g2d.drawImage(raw, 0, 0, null);
if (capture != null) {
int width2 = (int) (rectSize.width + rectSize.width * (zoom/500d));
int height2 = (int) (rectSize.height + rectSize.height * (zoom/500d));
int x2 = rectLocale.x - ((width2 - rectSize.width)/2);
int y2 = rectLocale.y - ((height2 - rectSize.height)/2);
Image scaledInstance = capture.getScaledInstance(
width2, height2, Image.SCALE_AREA_AVERAGING);
g2d.drawImage(scaledInstance, x2, y2, null);
g2d.drawRect(x2, y2, width2, height2);
} else {
g2d.draw(new Rectangle(rectLocale, rectSize));
}
}
};
b.addMouseMotionListener(behavior);
b.addMouseListener(behavior);
b.addMouseWheelListener(behavior);
JFrame f = new JFrame();
f.setLocation(10, 10);
f.setDefaultCloseOperation(3);
f.add(b);
f.pack();
f.setVisible(true);
}
private class MouseBehavior extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
startPoint = e.getPoint();
rectLocale = new Point();
rectSize = new Dimension();
capture = null;
if (e.getSource() instanceof JComponent) {
((JComponent) e.getSource()).repaint();
}
}
@Override
public void mouseDragged(MouseEvent e) {
Point currentPoint = e.getPoint();
rectSize.width = Math.abs(currentPoint.x - startPoint.x);
rectSize.height = Math.abs(currentPoint.y - startPoint.y);
if (e.isShiftDown()) {
rectSize.width = rectSize.height = Math.min(
rectSize.width, rectSize.height);
int dx = startPoint.x - rectSize.width;
int dy = startPoint.y - rectSize.height;
rectLocale.x = startPoint.x < currentPoint.x ? startPoint.x
: Math.max(dx, dy);
rectLocale.y = startPoint.y < currentPoint.y ? startPoint.y
: Math.min(dx, dy);
} else {
rectLocale.x = Math.min(currentPoint.x, startPoint.x);
rectLocale.y = Math.min(currentPoint.y, startPoint.y);
}
if (e.getSource() instanceof JComponent) {
((JComponent) e.getSource()).repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (rectSize.width <= 0 || rectSize.height <= 0) {
capture = null;
} else {
capture = raw.getSubimage(Math.max(0, rectLocale.x),
Math.max(0, rectLocale.y), rectSize.width, rectSize.height);
}
if (e.getSource() instanceof JComponent) {
((JComponent) e.getSource()).repaint();
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
zoom = Math.min(2000, Math.max(0, zoom + e.getUnitsToScroll() * 10));
if (e.getSource() instanceof JComponent) {
((JComponent) e.getSource()).repaint();
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
Example example = new Example();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
감사합니다. 문제는 사용자가 선택한 직사각형 영역의 좌표, 너비, 높이를 얻는 방법입니다. – NSR
편집보기; 'e.isShiftDown()'섹션은 마우스를 드래그하는 동안 SHIFT를 누르면 직사각형 대신 사각형을 그립니다. – oliholz
새로운 편집보기; 일부 버그 및 비율을 수정하고 마우스 스크롤을 통해 줌 – oliholz