여행에서 돌아오면 휴대폰에 수백 장의 사진이 남습니다. art-dorok의 자동 여행 사진집은 이 사진들을 "언제, 어디서"를 기준으로 장면별로 묶고, 연달아 찍은 비슷한 컷 중 가장 선명한 한 장을 대표로 남깁니다. 이 글에서는 그 과정이 실제로 어떤 기준으로 돌아가는지 숫자 그대로 공개하고, 기준을 알면 결과물을 어떻게 더 좋게 만들 수 있는지 정리합니다. 아래 수치는 모두 현재 서비스에 적용된 값입니다.
1. 업로드: 원본 대신 감상용 사본을 올립니다
사진은 서버로 보내기 전에 브라우저 안에서 먼저 줄입니다. 긴 변이 2048픽셀을 넘으면 비율을 유지한 채 2048픽셀로 맞추고, JPEG 품질 85%로 다시 저장합니다. 화면으로 보는 사진집에는 충분한 해상도이고, 수 MB짜리 스마트폰 원본이 대개 1MB 안팎으로 줄어 데이터 사용량과 업로드 시간이 크게 줄어듭니다. 세로로 찍은 사진이 눕지 않도록 회전 정보도 이 단계에서 반영합니다. 사진집 하나에는 최대 500장, 동영상은 파일당 100MB까지 넣을 수 있습니다.
- HEIC(아이폰 사진): 여러 장이 섞여 있으면 먼저 한 장만 열어 보고, 지금 쓰는 기기의 브라우저가 HEIC를 해독할 수 있는지 판단합니다. 아이폰에서는 대부분 그대로 처리되고, 윈도우 PC에서는 제외될 수 있습니다. 이때는 아이폰에서 직접 올리거나, iCloud.com에서 내려받을 때 "가장 호환성 높음"을 골라 JPG로 받으면 됩니다.
- RAW 파일: 아직 지원하지 않아 업로드 전에 제외 안내가 나옵니다. JPG로 현상한 파일을 올려주세요.
- iCloud 전용 사진: 기기에 내려받지 않은 '클라우드 전용' 사진은 끌어다 놓아도 파일이 넘어오지 않을 수 있습니다. 먼저 기기에 저장하거나, 끌어다 놓는 대신 눌러서 파일을 선택하세요.
2. 촬영 시간 찾기: EXIF가 없으면 파일 이름까지 읽습니다
장면 분류의 출발점은 촬영 시각입니다. 기본적으로 사진 파일 안의 EXIF 촬영 시각을 쓰지만, 카카오톡으로
주고받은 사진은 EXIF가 통째로 지워지는 경우가 많습니다. 그래서 EXIF가 없으면 파일 이름에서 날짜를 한 번 더
찾습니다. KakaoTalk_20260715_143022123.jpg라면 2026년 7월 15일 14시 30분 22초로 읽습니다.
해상도(1920x1080)나 일련번호가 날짜로 잘못 읽히지 않도록, 연도가 1990~2100 사이이고 실제로 존재하는 날짜일
때만 인정합니다.
다만 카카오톡 파일 이름의 시각은 촬영 시각이 아니라 사진을 받거나 저장한 시각입니다. 여행 중에 바로 주고받은 사진이라면 실제 촬영 시각과 크게 다르지 않지만, 여행이 끝나고 한꺼번에 받은 사진은 마지막 날 저녁처럼 엉뚱한 시간대로 모일 수 있습니다. 시간을 끝내 알 수 없는 사진은 다른 장면에 섞이지 않도록 맨 뒤의 별도 묶음으로 모읍니다.
3. GPS 없는 사진에 위치 물려주기 (앞뒤 30분 이내)
내 휴대폰 사진에는 GPS가 있어도, 일행이 보내준 사진이나 미러리스·DSLR 사진에는 위치가 없는 경우가 많습니다. 같은 시각에 같은 곳에서 찍었다면 위치도 같다고 보는 게 자연스럽기 때문에, 위치 없는 사진에는 앞뒤 30분 안에 찍힌 "GPS가 실제로 기록된 사진"의 좌표를 물려줍니다. 앞뒤 양쪽에 기준 사진이 있으면 시간 비율로 보간하고, 한쪽만 있으면 그 좌표를 그대로 씁니다.
두 가지 원칙을 지킵니다. 30분이 넘게 떨어져 있으면 그 사이에 이동했을 가능성이 커서 추정하지 않습니다. 그리고 이렇게 추정한 좌표를 다시 다른 사진의 기준으로 쓰지 않습니다. 추정의 추정을 허용하면 오차가 눈덩이처럼 커지기 때문입니다. 추정된 위치는 검토 화면에서 "추정 위치"로 따로 표시됩니다.
4. 장면을 나누는 세 가지 기준
사진을 촬영 시각 순서로 훑으면서, 다음 중 하나라도 해당하면 새 장면을 시작합니다.
- 3시간 이상 공백: 여행에서 3시간 동안 사진이 없다면 보통 이동했거나 식사·휴식으로 활동이 바뀐 시점입니다.
- 날짜가 바뀜: "1일차, 2일차"로 기억하는 여행 감각에 맞춰 자정을 넘기면 장면을 나눕니다.
- 장면 중심에서 500m 이상 이동: 관광지 하나가 대략 이 정도 크기여서 기준을 500m로 잡았습니다.
세 번째 기준에는 안전장치가 두 개 있습니다. 먼저 "장면 중심"은 평균이 아니라 최근 GPS 좌표 15개의 중앙값입니다. 지하철이나 실내, 고층 건물 사이에서는 GPS가 1~2km씩 튀는 일이 흔한데, 평균을 쓰면 튄 좌표 하나가 중심을 끌고 가서 멀쩡한 다음 사진까지 멀어 보이게 만듭니다. 중앙값은 표본의 절반이 틀리기 전까지 흔들리지 않습니다. 또 멀리 떨어진 좌표가 나와도 그다음 GPS 사진도 멀리 있을 때만 실제 이동으로 인정합니다. 튄 좌표 한 장 때문에 장면이 둘로 쪼개지는 것을 막기 위해서입니다. 거리 비교는 두 사진 모두 위치를 가지고 있을 때만 합니다.
5. 장면 제목은 지명 + 시간대
장면 중심 좌표로 OpenStreetMap의 지명을 찾아 "성산일출봉의 아침", "해운대의 저녁"처럼 제목을 붙입니다. 시간대는 5시 이전 새벽, 11시 이전 아침, 14시 이전 점심, 18시 이전 오후, 21시 이전 저녁, 그 이후는 밤입니다. 지명을 찾지 못하면 "7월 22일 아침"처럼 날짜와 시간대로 대신하고, 장면이 이틀에 걸치면 기간으로 표시합니다.
6. 비슷한 사진은 지문과 시간으로 묶습니다
같은 장면 안에서 연달아 찍은 거의 같은 컷은 하나로 묶고, 가장 잘 나온 한 장만 사진집에 보여줍니다. 판단에는 사진을 아주 작게 줄여 만든 64비트 "지문"(dHash·pHash)을 씁니다. 두 지문이 몇 비트나 다른지(해밍 거리)를 세어 가까우면 같은 컷으로 봅니다.
이 기준값은 실제 사진으로 재서 정했습니다. 29장짜리 여행 사진집을 분석해 보니, 몇 초 간격으로 같은 장면을 찍은 사진 쌍은 거리가 10~19였고, 서로 무관한 사진 쌍은 23 이상(중앙값 30)이었습니다. 처음에는 기준을 8로 잡았는데 한 쌍도 묶이지 않았습니다. 손떨림과 노출 변화만으로도 거리가 10 이상 벌어졌기 때문입니다. 지금은 이렇게 판단합니다.
- 촬영 시각이 90초 넘게 떨어져 있으면 구도가 같아도 다른 사진으로 봅니다. 아침 바다와 저녁 바다는 다른 사진이니까요.
- 15초 이내의 연사는 기준을 조금 넉넉하게(dHash 20 이하 또는 pHash 14 이하) 적용합니다.
- 그 밖에는 dHash 15 이하, pHash 10 이하, 또는 두 값이 동시에 18·12 이하일 때 같은 컷으로 봅니다.
묶음의 대표 사진은 선명도가 가장 높은 컷입니다. 선명도는 윤곽의 변화량(라플라시안 분산)으로 재는데, 줄인 사진에서 재면 흔들림이 가려지기 쉬워서, 업로드할 때 원본 해상도의 가운데 부분을 잘라 계산합니다.
7. 사람이 고친 것이 자동 판단보다 우선합니다
자동 분류는 시간과 거리만 보기 때문에 "이건 한 장면"이라는 사람의 판단을 따라가지 못할 때가 있습니다. 그래서 검토 화면에서 직접 합친 장면과 직접 바꾼 장면 제목은 다시 분석해도 그대로 유지됩니다. 장면을 둘로 나누거나, 빈 장면을 새로 만들거나, 장면 순서를 위아래로 바꿀 수도 있습니다. 비슷한 사진 묶음도 직접 묶거나 풀 수 있습니다. 완성된 사진집은 한 페이지에 최대 12장까지 배치됩니다.
8. 결과를 더 좋게 만드는 업로드 요령
- 카메라 시계부터 확인하세요. 해외여행에서 미러리스·DSLR의 시간대를 현지로 바꾸지 않으면 휴대폰 사진과 몇 시간씩 어긋나 엉뚱한 장면에 섞입니다. 장면 분류는 촬영 시각에 가장 크게 의존합니다.
- 휴대폰 카메라의 위치 기록을 켜 두세요. GPS가 있는 사진이 중간중간 섞여 있어야 다른 사진에도 위치를 물려줄 수 있습니다.
- 일행 사진은 여행 중에 바로 받고, 파일 이름은 그대로 두세요. 이름에 남은 날짜가 촬영 시각에 가까울수록 제자리를 잘 찾습니다.
- 미리 골라내지 말고 다 올리세요. 비슷한 컷 정리는 자동으로 됩니다. 손으로 먼저 지우다 보면 가장 선명한 컷을 지우기도 합니다.
- 표지는 마지막에 정하세요. 클래식 양장본, 모던 화이트, 필름 감성, 여행 노트, 매거진 다섯 가지 테마가 있고, 표지 제목 색은 10가지 프리셋이나 직접 고른 색으로 바꿀 수 있습니다.
장면이 정리된 뒤 사진을 이야기 순서로 다듬는 방법은 여행 사진을 스토리 사진집으로 만드는 편집법에 이어서 정리했습니다.