Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 네거티브 이미지를 포지티브 이미지로 변환하는 방법 완벽 가이드


사진 필름에서 보던 것처럼 색상이 반전된 네거티브(negative) 이미지를 원래의 포지티브(positive) 이미지로 되돌리는 원리는 생각보다 간단합니다. 핵심은 각 픽셀의 빨강(R), 초록(G), 파랑(B) 값을 255 - 현재 값으로 바꿔주는 것입니다. 이렇게 하면 밝은 부분은 어둡게, 어두운 부분은 밝게 반전되면서 원본 이미지가 자연스럽게 복원됩니다.

네거티브 → 포지티브 변환 절차

  • 이미지 로딩: ImageIO.read() 메서드로 변환할 이미지 파일을 읽어옵니다.

  • 크기 확인: 이미지의 가로(width)와 세로(height) 크기를 구합니다.

  • 픽셀 순회: 중첩 for 루프를 사용해 이미지의 모든 픽셀을 하나씩 탐색합니다.

  • 픽셀 값 추출: getRGB() 메서드로 픽셀 값을 가져옵니다.

  • ARGB 분리: 각 색상 성분을 얻으려면 해당 비트 위치까지 오른쪽 시프트(알파는 24비트, 빨강은 16비트, 초록은 8비트)한 뒤 0xff와 비트 AND 연산을 수행합니다. 이렇게 하면 마지막 8비트만 남기고 나머지 비트는 모두 제거됩니다.

  • 색상 반전: 빨강, 초록, 파랑 값을 각각 255에서 빼서 새로운 값을 계산합니다.

  • 픽셀 재구성: ARGB 값들을 각자의 위치로 왼쪽 시프트한 후 비트 OR 연산으로 하나의 픽셀 값으로 합칩니다.

  • 픽셀 적용: setRGB() 메서드로 새로운 픽셀 값을 이미지에 다시 설정합니다.

전체 예제 코드

import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class Negative2Color {
    public static void main(String args[]) throws IOException {
       // 이미지 읽기
       File file = new File("D:\\Images\\cat_neg.jpg");
       BufferedImage img = ImageIO.read(file);
       for (int y = 0; y < img.getHeight(); y++) {
           for (int x = 0; x < img.getWidth(); x++) {
               // 픽셀 값 가져오기
               int p = img.getRGB(x, y);
               // 픽셀 값에서 A R G B 성분 분리
               int a = (p >> 24) & 0xff;
               int r = (p >> 16) & 0xff;
               int g = (p >> 8) & 0xff;
               int b = p & 0xff;
               // RGB 값을 255에서 빼서 반전
               r = 255 - r;
               g = 255 - g;
               b = 255 - b;
               // 새로운 RGB 값으로 픽셀 재구성
               p = (a << 24) | (r << 16) | (g << 8) | b;
               img.setRGB(x, y, p);
           }
       }
       // 수정된 이미지 저장
       file = new File("D:\\Images\\negative_positive.jpg");
       ImageIO.write(img, "jpg", file);
       System.out.println("변환 완료...");
   }
}

실행 결과 확인

입력 이미지 (네거티브)

Java로 네거티브 이미지를 포지티브 이미지로 변환하는 방법 완벽 가이드

출력 이미지 (포지티브)

Java로 네거티브 이미지를 포지티브 이미지로 변환하는 방법 완벽 가이드

핵심 포인트 정리

위 예제는 JDK에 기본 포함된 BufferedImageImageIO 클래스만 사용하기 때문에 OpenCV와 같은 외부 라이브러리 없이도 바로 컴파일하고 실행할 수 있습니다. 특히 알파(A) 채널은 투명도 정보이므로 그대로 유지하고 RGB 값만 반전시키는 것이 중요합니다. 해상도가 큰 이미지를 다룰 경우에는 픽셀 단위 순회 대신 getRGB()setRGB()의 배열 버전을 활용하면 처리 속도를 크게 개선할 수 있습니다.