PHOTOSHOT / DEVELOPMENT JOURNAL
색상 반전을
한 레이어로
반전은 각 채널을 최댓값에서 빼는 간단한 계산입니다. 이 기능을 조정 레이어로 만들어 원본을 유지한 채 켜고 끄거나, 일부에만 적용할 수 있도록 했습니다.


12편의 사진은 반전 100% 결과입니다. 색을 뒤집는 계산 자체보다, 다른 조정과 같은 렌더링 구조 안에 어떻게 넣었는지 살펴봅니다.
반전에는 별도 강도 슬라이더를 넣지 않았습니다
반전 레이어의 고유 컨트롤은 비어 있습니다. 사용자가 정할 임계값이나 기준색이 없기 때문입니다. 효과의 강도는 공통 레이어 불투명도로 조절합니다.
invert: {
name: '반전',
description: 'RGB 색상을 반전합니다.',
controls: []
}사진을 직접 덮어쓰지 않고 조정 정보로 저장합니다. 레이어를 숨기면 이 단계를 건너뛰어 원래 결과를 볼 수 있고, 다시 켜면 같은 계산이 적용됩니다.
256개의 출력값을 미리 계산합니다
8비트 RGB에서 입력이 0이면 출력은 255, 입력이 255이면 출력은 0입니다. 엔진에서는 채널을 0~1로 바꾼 값 x에 다음 식을 적용합니다.
if (t === 'invert') x = 1 - x;밝기·레벨·곡선 등 채널별로 처리할 수 있는 조정은 0~255 입력에 대한 출력표를 만듭니다. 반전도 이 경로를 사용해, 각 픽셀에서는 채널값에 해당하는 칸을 읽습니다.
R·G·B를 서로 교환하는 채널 혼합과 달리, 각 채널은 자기 값만으로 계산됩니다. 알파 채널에는 반전 식을 적용하지 않습니다.
| 입력 한 채널 | 반전 결과 |
|---|---|
| 0 | 255 |
| 32 | 223 |
| 64 | 191 |
| 128 | 127 |
| 192 | 63 |
| 255 | 0 |
불투명도 50%에서 회색이 되는 이유
일반 합성에서 원래 값과 반전 값을 정확히 절반씩 섞으면, 두 값의 합이 항상 255이므로 127.5가 됩니다. 이론적인 반올림 결과는 RGB 128·128·128입니다. 실제 코드의 부동소수점 계산에서는 일부 입력이 127로 기록되어 1단계 차이가 날 수 있습니다.
result = original
+ (inverted - original) * opacity;위 식은 일반 합성 부분을 줄여 쓴 것입니다. 마스크가 있으면 불투명도에 마스크 알파를 곱한 양만 적용합니다. 마스크가 일정하지 않거나 합성 모드를 바꾸면 거의 일정한 중성 회색이 되는 조건도 달라집니다.
두 번 반전하면 원래 값으로 돌아옵니다
반전 레이어 두 개를 일반 합성·불투명도 100%·마스크 없음으로 쌓으면 255 − (255 − 값)이 됩니다. 두 번째 결과는 원래 RGB와 같습니다.
이 성질은 구현을 점검할 때도 쓸 수 있습니다. 반전 사이에 다른 보정을 넣거나 불투명도를 낮추면 이 등식이 성립하는 조건이 달라집니다.
Adobe의 반전 기능 설명을 참고하되, 여기서는 포토샷의 8비트 RGB 처리만 설명했습니다. 다른 색 공간과 비트 깊이까지 동일하게 동작한다는 의미는 아닙니다.
- 원래 값 40첫 번째 반전 → 215
- 두 번째 반전255 − 215 → 40
- 적용 조건두 레이어 모두 일반 합성 · 불투명도 100% · 마스크 없음
구현 코드와 참고 자료
- 반전 식과 채널별 변환표
Photoshot v0.16.0 · 실제 구현과 테스트 - 불투명도·마스크·알파 보존
Photoshot v0.16.0 · 실제 구현과 테스트 - Adobe · Invert의 기능 설명
기능 의미를 비교하기 위한 참고 문서입니다. Adobe의 내부 구현 코드 출처는 아닙니다.
