업로드하면 사진이 돌아가는 이유
카메라를 돌려도 사진이 실제로 회전하는 일은 거의 없다. 센서는 본체에 고정되어 있어서 어느 방향으로 들든 같은 직사각형을 기록하고, 카메라는 파일 안에 방향 태그를 적어 볼 때 어느 쪽으로 돌려야 하는지를 알린다. 그 사진을 보여주는 프로그램은 각자 그 태그를 존중할지 말지를 스스로 정한다. 두 프로그램의 판단이 갈리는 순간, 한쪽에서는 사진이 옆으로 눕는다.
카메라는 사진을 돌리지 않고 쪽지를 남긴다
JPEG이나 HEIC 파일의 EXIF 메타데이터에는 Orientation이라는 항목이 있고, 정의된 값은 여덟 개다. 하나는 파일이 이미 똑바로 서 있다는 뜻이고, 그중 셋은 90도, 180도, 270도 회전이며, 나머지 넷은 회전에 좌우 반전을 더한 조합이다.
그래서 폰으로 찍은 세로 사진은 대개 가로 이미지에 4분의 1 바퀴 돌리라는 쪽지가 붙은 형태다. 저장된 픽셀은 정말로 옆으로 누워 있고, 그것을 똑바로 보여주는 뷰어는 그릴 때마다 태그를 적용하고 있는 것이다.
어떤 프로그램은 쪽지를 따르고 어떤 프로그램은 무시한다
웹 브라우저는 일반 이미지를 표시할 때 이 태그를 적용하며, 이제는 그게 기본 동작이다. 하지만 파일을 원시 픽셀까지 디코딩하는 쪽은 누워 있는 그림을 보게 된다. 그 시점에서 태그는 헤더에 남겨진 숫자 하나일 뿐이기 때문이다.
업로드가 사진을 돌려버리는 이유가 여기에 있다. 사이트는 파일을 본 게 아니라 다시 인코딩했다. 크기를 줄이고, 메타데이터를 벗기고, WebP로 바꾼 결과물에는 쪽지가 붙어 있지 않다. 스크립트도 마찬가지다. 이미지 라이브러리는 요청할 때만 회전하며, 방향을 먼저 적용하라고 명시하지 않으면 알아서 돌려주지 않는다.
두 번 돌아가는 것도 실제로 일어나는 고장이다
반대쪽 실수도 그만큼 흔하다. 어떤 도구가 픽셀은 똑바로 돌려놓고 태그는 4분의 1 바퀴 돌리라는 상태로 남겨두면, 그 태그를 존중하는 다음 뷰어가 이미 올바른 사진을 한 번 더 돌린다. 결과는 반대쪽으로 누운 사진이다.
사진이 90도 틀어져 나올 때 쓸모 있는 질문은 둘 중 어느 쪽이 틀렸느냐다. 픽셀인가, 쪽지인가. 둘은 별개의 정보이고, 한 파일이 스스로 모순될 수 있다.
파일에 적힌 가로세로는 사진이 아니라 센서의 것이다
1200만 화소 폰으로 찍은 세로 사진은 스스로를 4032 × 3024, 즉 가로 사진이라고 보고한다. 헤더의 크기는 저장된 픽셀을 설명하고, 화면에서 그것을 세로로 만드는 건 방향 태그다.
그 숫자로 자리를 잡아두는 레이아웃이나, 그리기 전에 가로 사진인지 판단하는 검사는 세로 사진에서 틀리게 된다. 갤러리에 엉뚱한 자리에 빈칸이 생기는 문제는 CSS가 아니라 대개 이것이다.
좌우가 뒤집힌 셀카도 같은 구조다
여덟 개 방향 값 중 넷은 좌우 반전을 포함한다. 전면 카메라가 거울처럼 뒤집힌 미리보기를 보여주기 때문에 생긴 값이다. 어떤 앱은 저장하기 전에 픽셀을 뒤집고, 어떤 앱은 센서 이미지를 그대로 저장한 뒤 반전을 태그에 적는다.
증상은 글자에서 드러난다. 옷의 로고나 뒤쪽 화이트보드가 한 프로그램에서는 거꾸로 읽히고 다른 프로그램에서는 제대로 읽힌다면, 반전이 픽셀이 아니라 태그에 들어 있다는 뜻이다.
썸네일이 본 사진과 다를 수 있다
EXIF에는 촬영 시점에 카메라가 써 넣은 작은 썸네일이 함께 들어갈 수 있다. 파일 탐색기나 사진 앱은 전체 이미지를 읽는 것보다 훨씬 빠르기 때문에 그 썸네일을 자주 보여준다.
그런데 편집기가 늘 그것을 갱신하지는 않는다. 자르거나 회전해서 사진은 바뀌었는데 예전 썸네일이 그대로 남으면, 미리보기와 열어본 파일이 서로 다른 그림을 보여주는 이상한 상황이 생긴다. 덜 눈에 띄지만 더 중요한 건, 잘라냈다고 생각한 부분이 썸네일 안에 남아 있을 수 있다는 점이다.
잘못 읽힐 수 없는 사진 만들기
무엇을 하기 전에 먼저 태그를 읽어라. 회전 문제인지 반전 문제인지, 애초에 파일이 돌려달라고 말하고는 있는지가 거기서 갈린다. 태그는 이미 똑바로라고 되어 있는데 사진이 누워 있다면, 앞단의 무언가가 픽셀을 되돌릴 수 없게 돌려놓은 것이다.
오래가는 해법은 회전을 픽셀에 구워 넣고 태그를 똑바름으로 바꾸거나 메타데이터를 아예 제거해서, 이후 어떤 프로그램도 다시 돌릴 수 없게 만드는 것이다. 업로드한 뒤가 아니라 업로드하기 전에 해야 한다. 사이트가 한 번 다시 인코딩하고 메타데이터를 벗기고 나면, 어떻게 돌려야 하는지 알려줄 쪽지는 이미 사라진 뒤다.