← 모두의 툴

ICO 파일 속 아이콘, 사실은 전부 PNG로 저장된다

가이드 · 2026.08.21 최종 확인

파비콘을 만들려고 ICO 파일을 열어본 적이 있다면, 그 안에 16×16부터 256×256까지 여러 크기의 이미지가 한꺼번에 들어 있다는 사실을 알 것입니다. 그런데 정작 "그 안의 이미지가 어떤 형식으로 저장되는가"는 잘 알려져 있지 않습니다. 결론부터 말하면, 요즘 만들어지는 대부분의 ICO 파일은 이미지 데이터를 PNG 바이트 그대로 담고 있습니다. 이 가이드는 ICO 포맷의 구조와 그 안에서 PNG가 표준이 된 이유를, ICO 변환기의 실제 동작 코드를 근거로 설명합니다.

1. ICO는 이미지 포맷이 아니라 "컨테이너" 포맷이다

PNG나 JPG는 이미지 하나를 인코딩하는 방식이지만, ICO는 애초에 설계 목적이 다릅니다. ICO 파일 하나에는 ICONDIR라는 헤더와 그 뒤로 여러 개의 ICONDIRENTRY(각 해상도별 항목)가 이어지고, 실제 이미지 바이트들은 파일 뒷부분에 순서대로 붙습니다. 즉 ICO는 "16×16짜리 이미지, 32×32짜리 이미지, 256×256짜리 이미지를 한 파일에 묶어서 운영체제가 상황에 맞는 크기를 골라 쓰게 하는" 컨테이너입니다. 이 컨테이너 안에 들어가는 각 이미지의 실제 인코딩 방식은 ICO 스펙이 두 가지를 허용합니다 — 비압축 BMP(DIB) 비트맵, 그리고 PNG.

2. 과거 방식: 비압축 BMP의 용량 문제

전통적인 ICO는 각 해상도의 이미지를 BMP(DIB, Device Independent Bitmap) 형식으로 저장했습니다. BMP는 픽셀 색상값을 압축 없이 그대로 나열하는 방식이라 구현이 단순하고 오래된 시스템에서도 호환성이 좋았지만, 크기가 커질수록 파일 용량이 기하급수적으로 늘어난다는 치명적인 단점이 있습니다. 특히 Windows Vista부터 지원되기 시작한 256×256 같은 큰 아이콘을 BMP로 저장하면 파일 하나가 수백 KB에 달해 비효율적입니다.

3. Windows Vista 이후: PNG 바이트를 그대로 담는 방식

이 문제를 해결하기 위해 Windows Vista(2007) 이후부터 ICONDIRENTRY 안에 BMP 대신 PNG로 압축 인코딩된 이미지 바이트를 그대로 넣는 방식이 표준으로 자리잡았습니다. ICO 헤더 구조 자체는 그대로 두고, 그 안에 담기는 "이미지 데이터가 무엇이냐"만 BMP에서 PNG로 바뀐 것입니다. 운영체제와 브라우저는 ICONDIRENTRY를 읽을 때 데이터의 첫 바이트가 PNG 시그니처(\x89PNG)인지 BMP 헤더인지 확인해 알아서 맞는 방식으로 디코딩합니다. 결과적으로 같은 화질이라도 파일 용량이 크게 줄어들고, 특히 단색 영역이 많은 아이콘·로고에서는 압축 효율이 더 두드러집니다.

4. modoohub ICO 변환기는 실제로 어떻게 만드는가

ICO 변환기의 코드를 직접 확인한 결과, 이 도구는 선택한 모든 크기(16×16처럼 작은 크기 포함)에 대해 예외 없이 PNG 압축 방식을 사용합니다. 변환 과정은 다음과 같습니다.

  1. 원본 이미지가 정사각형이 아니면 drawSize() 함수가 가로·세로 중 짧은 쪽 길이를 기준으로 중앙을 정사각형으로 크롭합니다.
  2. 각 목표 크기로 리사이즈한 뒤 canvas.toDataURL('image/png')로 PNG 바이트를 얻습니다.
  3. buildIco() 함수가 ICONDIR 헤더와 각 크기별 ICONDIRENTRY를 직접 바이트 단위로 조립하고, 앞서 얻은 PNG 바이트를 그 뒤에 이어 붙입니다.

흥미로운 디테일 하나는 크기 필드 처리입니다. ICONDIRENTRY의 가로·세로 크기는 1바이트 필드라 0~255까지만 표현할 수 있는데, ICO 스펙은 256을 담아야 할 때 이 필드에 0을 넣는 특별 규칙을 정해두었습니다. 코드에서는 sz===256?0:sz로 정확히 이 규칙을 따르고 있습니다. 이런 저수준 규칙까지 스펙대로 구현되어 있어야 Windows·브라우저 양쪽에서 깨지지 않는 ICO가 만들어집니다.

5. 용량으로 체감하는 BMP와 PNG의 차이

256×256 크기 하나만 놓고 봐도 두 방식의 용량 차이는 명확합니다. 32비트 무압축 BMP는 픽셀당 4바이트를 그대로 저장하므로 계산이 단순합니다.

방식256×256 1개 항목 용량(근사치)비고
32비트 BMP(무압축)약 264KB (256×256×4바이트 색상 + AND 마스크)픽셀 수에 정비례해 용량 증가
PNG 압축수 KB~수십 KB (이미지 내용에 따라 편차)단색·투명 영역이 많을수록 더 작아짐

16×16, 32×32, 48×48처럼 작은 아이콘은 BMP로 저장해도 용량 차이가 크지 않지만, 128×128이나 256×256처럼 큰 해상도가 포함되는 순간 BMP 대비 PNG의 용량 이점이 뚜렷해집니다. 여러 해상도를 한 파일에 담아야 하는 ICO의 특성상, 큰 해상도 하나가 전체 파일 용량을 좌우하기 쉽습니다.

6. 호환성은 걱정하지 않아도 될까

Windows Vista 이후 출시된 모든 운영체제와 현재 사용되는 모든 주요 브라우저는 PNG 압축 방식의 ICO 항목을 문제없이 읽습니다. 파비콘을 만들 목적이라면 사실상 걱정할 이유가 없습니다. PNG로 저장된 원본이라면 알파 채널(투명 배경)도 그대로 유지되므로, 배경이 투명한 로고를 파비콘으로 만들 때도 파비콘 생성기와 조합해 활용할 수 있습니다.

자주 묻는 질문

Q. ICO 파일 안의 이미지가 전부 PNG라면 확장자를 .png로 바꿔도 되나요?

안 됩니다. ICO 파일은 ICONDIR 헤더와 여러 ICONDIRENTRY 구조체로 감싸인 컨테이너이고, 그 안에 PNG 바이트가 "일부로" 포함되어 있을 뿐입니다. 확장자만 바꾼다고 유효한 PNG 파일이 되지 않습니다. 개별 이미지를 PNG로 쓰고 싶다면 별도로 추출하거나 이미지 변환 도구를 이용해야 합니다.

Q. 모든 ICO 변환 도구가 PNG 방식을 쓰나요?

아니요. 도구마다 구현이 다릅니다. 오래된 유틸리티나 레거시 코드는 여전히 BMP(DIB) 방식으로 인코딩하기도 합니다. modoohub의 ICO 변환기는 선택한 모든 크기에 대해 PNG 압축 방식만 사용하도록 구현되어 있습니다.

Q. 원본 이미지가 정사각형이 아니면 어떻게 되나요?

변환기의 drawSize() 함수가 가로·세로 중 짧은 쪽 길이를 기준으로 이미지 중앙을 정사각형으로 크롭한 뒤 목표 크기로 리사이즈합니다. 피사체가 이미지 중앙에서 벗어나 있으면 크롭 과정에서 일부가 잘려나갈 수 있으므로, 정확한 결과를 원한다면 변환 전에 미리 정사각형으로 다듬어 업로드하는 것이 안전합니다.

Q. 256×256 크기를 꼭 포함해야 하나요?

웹사이트 파비콘 용도라면 16×16, 32×32, 48×48 정도만으로도 충분한 경우가 많습니다. 256×256은 Windows 바로가기 아이콘처럼 큰 아이콘이 필요할 때 포함하면 되며, 포함할수록 파일 용량은 커집니다.