사진 필름에서 보던 것처럼 색상이 반전된 네거티브(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("변환 완료...");
}
}
실행 결과 확인
입력 이미지 (네거티브)

출력 이미지 (포지티브)

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