김솔비 블로그
개발 도구

이미지 속성 검사 도구

이미지 EXIF 속성 확인 및 브라우저에서의 처리 방식

기간
2024.09.14 ~ 2024.09.14
기술
HTML, CSS, JavaScript

개발 배경: 왜 이미지가 제멋대로 회전할까?

디자인 업체에서 받은 사진으로 퍼블리싱 작업을 하던 중 난관에 부딪혔다. PC 탐색기에서는 멀쩡하게 보이는 가로 사진이, 웹 브라우저나 모바일 환경에서만 세로로 눕거나 뒤집혀 보이는 현상이 생긴 것이다.

처음에는 단순한 CSS 문제라고 생각했지만, transform: rotate()로 강제로 돌리면 원본 비율이 깨지거나 레이아웃이 틀어지는 부작용이 있었다. 근본 원인을 파고들다가 EXIF Orientation이라는 개념을 알게 됐고, 이를 눈으로 직접 확인하고 검증할 수 있는 도구가 필요하다고 느껴 이 프로젝트를 시작했다.

문제 분석: 브라우저마다 다른 렌더링

가장 혼란스러웠던 점은 같은 이미지라도 환경에 따라 다르게 보인다는 것이었다.

예를 들어 스마트폰으로 찍은 사진을 <img> 태그로 불러오면 옆으로 누워 보이는데, 같은 파일을 브라우저 주소창에 직접 입력해 열면 정상적인 방향으로 보였다.

조사해 보니 브라우저가 EXIF 메타데이터를 처리하는 방식의 차이 때문이었다.

  • Firefox — CSS image-orientation: from-image;를 지원해 EXIF 정보를 읽고 이미지를 자동으로 회전시켜 준다.
  • Chrome / Safari — 이미지 파일을 직접 열 때는 EXIF를 반영하지만, 당시 작업 환경에서는 <img> 태그로 넣은 이미지의 EXIF 회전 값을 무시하고 원본 그대로 그리는 경우가 있었다.

📌 참고

지금은 Chrome 81, Safari 13.1부터 <img>에도 EXIF 방향이 기본으로 적용된다. 다만 Canvas로 이미지를 처리하거나 오래된 브라우저·웹뷰를 지원해야 한다면 여전히 같은 문제를 만날 수 있다.

해결 과정: EXIF 데이터 직접 파싱

결국 크로스 브라우징 문제를 해결하려면 브라우저의 기본 동작에 기댈 수 없었다. 그래서 JavaScript로 이미지의 바이너리 데이터를 직접 읽어 EXIF 태그를 파싱하고, Orientation 값에 따라 Canvas로 이미지를 다시 그리는 방식을 택했다.

  1. FileReader로 이미지를 ArrayBuffer 형태로 읽는다.
  2. DataView로 JPEG 마커(0xFFE1)를 찾아 EXIF 데이터를 추출한다.
  3. 0x0112(Orientation) 태그 값을 찾아 회전 각도를 계산한다.
  4. Canvas에 이미지를 그릴 때 계산한 각도만큼 rotate()와 scale()을 적용한다.

이렇게 해서 어떤 브라우저, 어떤 기기에서든 사용자가 의도한 방향대로 이미지를 보여 줄 수 있게 되었다.

결과물 및 배포

완성된 Image EXIF Inspector는 별도 서버 없이 브라우저에서만 동작하는 가벼운 도구다. 드래그 앤 드롭만으로 이미지에 숨겨진 메타데이터를 확인하고, 브라우저가 이를 어떻게 렌더링하는지 미리 볼 수 있어 퍼블리싱 작업에 큰 도움이 되고 있다.

  • Tech Stack — HTML, CSS, Vanilla JavaScript

만들며 한 생각

EXIF Orientation 문제 발견
EXIF Orientation 문제 발견모바일에서 촬영한 세로 이미지가 PC 웹 브라우저에서는 가로로 눕거나 뒤집혀 보이는 현상을 발견했습니다. 이는 이미지 파일 내부의 EXIF Orientation 값을 브라우저마다 다르게 해석하기 때문입니다.
브라우저별 렌더링 차이 분석
브라우저별 렌더링 차이 분석Firefox는 CSS `image-orientation: from-image` 속성을 지원하여 EXIF 정보를 반영하지만, Chrome과 Safari는 `<img>` 태그에서 이를 기본적으로 무시하는 경향이 있어 일관되지 않은 사용자 경험을 제공합니다.
EXIF 데이터 파싱 로직 구현
EXIF 데이터 파싱 로직 구현JavaScript 라이브러리 없이 순수 `DataView`와 `ArrayBuffer`를 사용하여 이미지의 바이너리 데이터를 직접 읽고, APP1 마커를 찾아 EXIF 태그를 파싱하는 로직을 구현했습니다.
Orientation 값 추출 및 매핑
Orientation 값 추출 및 매핑파싱된 데이터에서 `0x0112` (Orientation) 태그 값을 추출했습니다. 1번부터 8번까지의 각 값이 의미하는 회전 각도와 플립(Flip) 상태를 정의하고 매핑 테이블을 작성했습니다.
Canvas를 활용한 이미지 보정
Canvas를 활용한 이미지 보정단순 CSS 회전만으로는 레이아웃이 깨질 수 있어, `Canvas` API를 활용했습니다. 추출한 Orientation 값에 따라 캔버스를 회전(`rotate`) 및 반전(`scale`) 시킨 후 이미지를 다시 그려 원본과 동일한 시각적 결과를 만들어냈습니다.
드래그 앤 드롭 UX 개선
드래그 앤 드롭 UX 개선사용자가 이미지를 쉽게 업로드할 수 있도록 드래그 앤 드롭 영역을 직관적으로 디자인했습니다. 파일이 드롭되면 즉시 `FileReader`로 읽어들여 분석을 시작하도록 이벤트를 처리했습니다.
메타데이터 시각화 UI
메타데이터 시각화 UI단순히 이미지만 보여주는 것이 아니라, 분석된 모든 EXIF 메타데이터(카메라 모델, 촬영 일시, ISO, 셔터 스피드 등)를 테이블 형태로 깔끔하게 정리하여 사용자에게 제공했습니다.
썸네일 추출 및 미리보기
썸네일 추출 및 미리보기고해상도 원본 이미지를 로딩하는 동안 사용자 경험을 해치지 않도록, EXIF 내에 포함된 썸네일 데이터를 추출하여 즉시 미리보기를 제공하는 최적화 작업을 수행했습니다.
다크 모드 지원
다크 모드 지원사용자의 시스템 설정에 따라 자동으로 다크 모드와 라이트 모드가 전환되도록 CSS 변수(Variables)를 활용하여 테마 시스템을 구축했습니다.
반응형 디자인 적용
반응형 디자인 적용PC뿐만 아니라 모바일 환경에서도 EXIF 정보를 쉽게 확인할 수 있도록 미디어 쿼리를 사용하여 레이아웃이 유동적으로 변하도록 반응형 디자인을 적용했습니다.
최종 결과물 및 배포
최종 결과물 및 배포완성된 프로젝트는 GitHub Pages를 통해 배포하였으며, 별도의 서버 없이 클라이언트 사이드에서만 동작하도록 설계하여 유지비용을 0원으로 만들었습니다.