본문 바로가기

자바(java)

사진 필터 앱: 카메라로 촬영한 사진에 다양한 필터를 적용하는 어플리케이션을 만듭니다.

반응형

사진 필터 애플리케이션은 사용자가 카메라로 촬영한 사진에 다양한 시각적 효과를 적용할 수 있도록 해주는 프로그램입니다. 이 애플리케이션을 자바로 구현하기 위해 Java Swing을 사용한 GUI 기반의 애플리케이션을 만들고, 자바의 BufferedImage 클래스를 활용하여 이미지에 필터를 적용할 수 있습니다.

1. 내용 설명

사진 필터 앱은 사용자가 이미지 파일을 열고, 선택한 필터(예: 흑백, 세피아, 밝기 조절 등)를 적용하여 수정된 이미지를 볼 수 있게 해줍니다. 사용자는 원하는 필터를 적용한 후 결과 이미지를 저장할 수도 있습니다.

2. 프로그램간 사용 함수 설명

  • openImage(): 사용자가 이미지 파일을 열 수 있도록 합니다.
  • applyFilter(BufferedImage image, String filterType): 선택한 필터 타입에 따라 이미지에 필터를 적용합니다.
  • saveImage(BufferedImage image, String path): 수정된 이미지를 지정된 경로에 저장합니다.
  • createUI(): 사용자 인터페이스를 생성하고 이벤트 리스너를 설정합니다.

3. 코딩 내용

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import javax.imageio.ImageIO;
import java.io.*;

public class PhotoFilterApp2 extends JFrame {
    private BufferedImage originalImage;
    private BufferedImage filteredImage;
    private JLabel imageLabel;

    public PhotoFilterApp2() {
        setTitle("Photo Filter App");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        imageLabel = new JLabel();
        JScrollPane scrollPane = new JScrollPane(imageLabel);
        add(scrollPane, BorderLayout.CENTER);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu fileMenu = new JMenu("File");
        JMenuItem openItem = new JMenuItem("Open");
        JMenuItem saveItem = new JMenuItem("Save");
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        menuBar.add(fileMenu);

        JMenu filterMenu = new JMenu("Filters");
        JMenuItem grayscaleItem = new JMenuItem("Grayscale");
        JMenuItem sepiaItem = new JMenuItem("Sepia");
        filterMenu.add(grayscaleItem);
        filterMenu.add(sepiaItem);
        menuBar.add(filterMenu);

        openItem.addActionListener(e -> openImage());
        saveItem.addActionListener(e -> saveImage());
        grayscaleItem.addActionListener(e -> applyFilter("grayscale"));
        sepiaItem.addActionListener(e -> applyFilter("sepia"));
    }

    private void openImage() {
        JFileChooser fileChooser = new JFileChooser();
        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                File file = fileChooser.getSelectedFile();
                originalImage = ImageIO.read(file);
                filteredImage = originalImage;
                imageLabel.setIcon(new ImageIcon(originalImage));
                pack();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void saveImage() {
        if (filteredImage != null) {
            JFileChooser fileChooser = new JFileChooser();
            if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                try {
                    File file = fileChooser.getSelectedFile();
                    ImageIO.write(filteredImage, "png", file);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void applyFilter(String filterType) {
        if (originalImage == null) return;

        if (filterType.equals("grayscale")) {
            filteredImage = new BufferedImage(originalImage.getWidth(),
                                              originalImage.getHeight(),
                                              BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = filteredImage.createGraphics();
            g2d.drawImage(originalImage, 0, 0, null);
            g2d.dispose();

            for (int i = 0; i < filteredImage.getWidth(); i++) {
                for (int j = 0; j < filteredImage.getHeight(); j++) {
                    int p = filteredImage.getRGB(i, j);
                    int a = (p >> 24) & 0xff;
                    int r = (p >> 16) & 0xff;
                    int g = (p >> 8) & 0xff;
                    int b = p & 0xff;
                    int avg = (r + g + b) / 3;
                    p = (a << 24) | (avg << 16) | (avg << 8) | avg;
                    filteredImage.setRGB(i, j, p);
                }
            }
        } else if (filterType.equals("sepia")) {
            // 세피아 필터 적용 로직
        }

        imageLabel.setIcon(new ImageIcon(filteredImage));
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new PhotoFilterApp2().setVisible(true);
        });
    }
}

 

4. 전문용어

  • Java: 객체 지향 프로그래밍 언어입니다.
  • Swing: Java의 GUI 툴킷입니다.
  • BufferedImage: 이미지 데이터를 담는 클래스입니다.
  • ImageIO: 이미지 읽기/쓰기를 위한 클래스입니다.

5. 라이브러리 추가 및 실행 방법

라이브러리

  • Java 표준 라이브러리 (Swing, AWT, ImageIO)

실행 방법

  1. Java 개발 환경을 설치합니다.
  2. 위의 코드를 Java 파일로 저장합니다.
  3. 컴파일 후 실행합니다.

컴파일

javac -encoding UTF-8 PhotoFilterApp2.java

 

실행

 java PhotoFilterApp2

반응형