본문 바로가기

Swing/Image Drawing

자바 이미지 그리기

자바에서 화면에 이미지 그리기 예 (Java Image Drawing example)


개요

JPanel 을 상속하여 ImagePanel 을 생성하고 JPanel의 paintComponent()를 오버라드이하면 화면에 그림에 그릴 수 있다

JPanel 위에 이미지를 출력하고, 축소/확대, 이동, 회전, 저장하는 예이다



Screen Shot


java_img_drawing.zip


테스트 항목

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);

            }

        });

    }

}