블로그 › 아이폰 사진이 컴퓨터에서 안 열리는 이유
아이폰으로 찍은 사진을 컴퓨터로 옮겼더니 확장자가 .HEIC이고 열리지 않습니다. 이메일에 첨부해도 상대방이 못 보고, 웹사이트 업로드 창에서는 아예 선택이 안 됩니다. 흔한 반응은 "애플이 또 이상한 짓을 했다"인데, 사정은 조금 다릅니다.
HEIC는 두 가지가 합쳐진 이름입니다. 겉의 컨테이너는 HEIF이고, 안에서 픽셀을 압축하는 코덱은 HEVC(H.265)입니다. HEVC는 원래 4K 동영상을 위해 만들어진 코덱인데, 동영상 한 프레임을 잘 압축하는 기술은 사진 한 장에도 그대로 통합니다.
결과는 분명합니다. 눈으로 구분하기 어려운 수준의 화질에서 JPEG의 절반 남짓한 용량이 나옵니다. 128GB 아이폰에 사진을 두 배로 넣을 수 있다는 뜻입니다. 애플이 2017년 iOS 11부터 기본 포맷으로 바꾼 이유가 이것입니다.
용량만이 아닙니다. JPEG는 색을 채널당 8비트로만 저장하는데 HEIC는 10비트를 담을 수 있어서 하늘의 그러데이션에 계단 현상이 덜합니다. 투명도도 지원하고, 한 파일에 여러 장을 넣을 수 있어서 라이브 포토와 심도 정보도 여기에 들어갑니다. 1992년에 나온 JPEG로는 할 수 없는 일들입니다.
기술적으로 어려워서가 아닙니다. HEVC에 특허료가 붙어 있기 때문입니다.
JPEG는 관련 특허가 오래전에 만료되어 누구나 자유롭게 구현할 수 있습니다. 반면 HEVC는 여러 회사가 나눠 가진 특허 덩어리이고, 심지어 특허 풀이 하나로 통합되지도 않았습니다. 디코더를 제품에 넣으려면 여러 곳과 각각 협상해야 합니다.
브라우저 입장에서 이건 감당하기 어려운 조건입니다. 크롬이나 파이어폭스는 전 세계에 무료로 배포되는데, 사용자 수에 비례해 특허료를 내야 한다면 계산이 서지 않습니다. 오픈소스로 배포하기도 곤란합니다. 그래서 기술이 아니라 라이선스 때문에 지원하지 않는 쪽을 택했습니다.
정리하면 이렇습니다. 애플은 자기 생태계 안에서는 값을 치르고 문제를 해결했지만, 그 밖으로 사진이 나가는 순간 값을 치르지 않은 세계와 만납니다. 사용자 눈에는 그저 "아이폰 사진이 안 열린다"로 보입니다.
크롬이 HEIC를 모른다면, 디코더를 직접 들고 가면 됩니다. C로 짜인 HEIF 디코더를 WebAssembly로 컴파일해 브라우저에서 실행하는 방식입니다. 브라우저가 코덱을 몰라도, 코덱 자체를 페이지가 데려오면 그만입니다.
다만 이 디코더는 압축해도 1MB 정도 됩니다. 모든 방문자에게 이걸 미리 내려받게 하는 건 낭비입니다. 열에 아홉은 그냥 페이지를 구경만 하고 떠나니까요. 그래서 순서를 이렇게 잡았습니다.
사진 자체는 어디로도 전송되지 않습니다. 디코딩부터 JPEG로 다시 저장하는 것까지 전부 브라우저 안에서 끝납니다. 인물 사진이나 문서 촬영본을 남의 서버에 올리지 않아도 된다는 뜻입니다.
쓰고 있는 디코더 libheif는 LGPL-3.0 라이선스입니다. GPL만큼 강하지는 않지만 조건이 하나 붙습니다 — 사용자가 이 라이브러리를 자기가 고친 버전으로 교체할 수 있어야 한다는 것입니다.
번들러를 그냥 돌리면 이 조건이 깨집니다. 라이브러리 코드가 앱 코드와 뒤섞여 하나의 파일로 압축되면, 그 안에서 libheif만 골라 바꿀 방법이 없어지기 때문입니다. 그래서 이 파일만은 번들에 넣지 않고 원본 그대로 별도 경로에 두고 런타임에 불러옵니다. 최소화도, 이름 변경도 하지 않습니다.
의도치 않게 섞여 들어가는 일을 막으려고 빌드 후 검사도 넣어 두었습니다. 앱 청크 안에 libheif의 내부 함수 이름이 등장하면 실패로 봅니다. 라이선스 준수는 한 번 지키고 끝나는 게 아니라 계속 확인해야 하는 종류의 일이더군요.
됩니다. 아이폰 설정 → 카메라 → 포맷에서 "높은 호환성"을 고르면 그때부터 JPEG로 저장됩니다. 사진을 찍으면 대부분 바로 다른 사람에게 보낸다면 이 편이 속 편합니다.
대신 저장 공간을 두 배로 씁니다. 어느 쪽이 나은지는 사용 습관에 달렸습니다. 평소에는 HEIC로 두고 남에게 보낼 때만 변환하는 방식이 저장 공간과 호환성 사이에서 가장 손해가 적습니다.
지금 있는 HEIC 사진을 변환하려면
업로드 없이 기기 안에서 JPG · PNG · WebP로 바꿉니다.