자바에서 화면에 이미지 그리기 예 (Java Image Drawing example)
개요
JPanel 을 상속하여 ImagePanel 을 생성하고 JPanel의 paintComponent()를 오버라드이하면 화면에 그림에 그릴 수 있다
JPanel 위에 이미지를 출력하고, 축소/확대, 이동, 회전, 저장하는 예이다
Screen Shot
테스트 항목
Image Drawing
Scaling
Translation
Rotation
Save Image to file
테스트환경
- JDK 1.7
- NetBeans 8
- Windows 7
ImagePanel.java
package org.kdea.java;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImagePanel extends JPanel
{
Image img, img2;
int x, y;
double scaleRatio = 1.0;
double angle;
static final int LEFT = 0;
static final int RIGHT = 1;
public ImagePanel(String fileName)
{
try {
InputStream in = getClass().getResourceAsStream(fileName);
BufferedImage bi = ImageIO.read(in);
img = bi;
img2 = img;
} catch (IOException ex) {
ex.printStackTrace();
}
setBorder(BorderFactory.createLineBorder(Color.yellow));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(img2, x, y, this);
}
public void scale()
{
try {
int w = (int) (img.getWidth(this)*scaleRatio);
int h = (int) (img.getHeight(this)*scaleRatio);
BufferedImage bi = null;
bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setTransform(AffineTransform.getScaleInstance(scaleRatio, scaleRatio));
g2d.drawImage(img, 0, 0, this);
g2d.dispose();
img2 = bi;
repaint();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void increaseScale()
{
scaleRatio *= 1.05;
scale();
}
public void decreaseScale()
{
scaleRatio /= 1.05;
scale();
}
public void rotate(int direction)
{
if(direction==LEFT) angle -= 1;
else angle += 1;
double rads = Math.toRadians(angle);
double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
int w = img.getWidth(this);
int h = img.getHeight(this);
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage bi = null;
bi = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
int x = w / 2;
int y = h / 2;
at.rotate(Math.toRadians(angle), x, y);
g2d.setTransform(at);
g2d.drawImage(img, 0, 0, this);
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, newWidth - 1, newHeight - 1);
g2d.dispose();
img2 = bi;
repaint();
}
public void move(int x, int y)
{
this.x += x;
this.y += y;
repaint();
}
public void save() throws IOException{
JFileChooser fileChooser = new JFileChooser();
fileChooser.addChoosableFileFilter(new PngSaveFilter());
fileChooser.addChoosableFileFilter(fileChooser.getChoosableFileFilters()[0]);
fileChooser.showSaveDialog(null);
File saveFile = fileChooser.getSelectedFile();
if(!saveFile.getName().toLowerCase().endsWith(".png")) {
saveFile = new File(saveFile.getAbsolutePath()+".png");
}
//JOptionPane.showMessageDialog(null, fileName);
ImageIO.write((BufferedImage)img2, "PNG", saveFile);
JOptionPane.showMessageDialog(this, "파일 저장 성공");
}
}
PngSaveFilter.java
package org.kdea.java;
import java.io.File;
import javax.swing.filechooser.FileFilter;
public class PngSaveFilter extends FileFilter
{
public boolean accept(File f)
{
if(f.isDirectory())
{
return true;
}
return f.getName().endsWith(".png");
}
public String getDescription()
{
return "PNG files (*.png)";
}
}
MainFrame.java
package org.kdea.java;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class MainFrame extends JFrame {
private ImagePanel imgPanel;
private int prevX, prevY;
public MainFrame() {
initComponents();
setTitle("이미지 그리기 예제");
imgPanel = new ImagePanel("페르시안스마일.jpg");
imgPanel.setBounds(0, 0, 350, 380);
getContentPane().add(imgPanel);
imgPanel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
System.out.println("MousePressed");
prevX = e.getX();
prevY = e.getY();
}
});
imgPanel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
imgPanel.move(e.getX()-prevX, e.getY()-prevY);
prevX = e.getX();
prevY = e.getY();
}
});
}
.............................
...........................
................................................
private void jButtonSmallerActionPerformed(java.awt.event.ActionEvent evt) {
imgPanel.decreaseScale();
}
private void jButtonLargerActionPerformed(java.awt.event.ActionEvent evt) {
imgPanel.increaseScale();
}
private void jButtonRotLeftActionPerformed(java.awt.event.ActionEvent evt) {
imgPanel.rotate(imgPanel.LEFT);
}
private void jButtonRotRightActionPerformed(java.awt.event.ActionEvent evt) {
imgPanel.rotate(imgPanel.RIGHT);
}
private void jButtonSaveActionPerformed(java.awt.event.ActionEvent evt) {
try {
imgPanel.save();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
public static void main(String[] args) {
..............
............
...........................
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
}