ICO (파일 포맷)

extendedto = CUR extendedto = **ICO 파일 포맷**은 마이크로소프트 윈도우의 컴퓨터 아이콘을 위한 이미지 파일 형식이다. ICO 파일은 여러 크기와 색 깊이를 가진 하나 이상의 작은 이미지를 포함하여 적절하게 확대/축소될 수 있도록 한다. 윈도우에서 바탕 화면, 시작 메뉴 또는 파일 탐색기에서 사용자에게 아이콘을 표시하는 모든 실행 파일은 ICO 형식으로 아이콘을 포함해야 한다. **CUR 파일 포맷**은 마이크로소프트 윈도우에서 애니메이션이 없는 커서를 위한 거의 동일한 이미지 파일 형식이다. 이 두 파일 형식의 유일한 차이점은 파일을 식별하는 데 사용되는 바이트와 CUR 형식 헤더에 핫스팟이 추가된 것이다. 핫스팟은 커서 이미지의 왼쪽 상단 모서리부터 사용자가 실제로 마우스를 가리키는 지점까지의 픽셀 오프셋(x, y 좌표)으로 정의된다. ANI 파일 형식은 애니메이션된 윈도우 커서에 사용된다.
# 역사
윈도우 1.0에 도입된 아이콘은 32×32 픽셀 크기였고 단색이었다.access-date=June 6, 2011 16색 지원은 윈도우 3.0에서 도입되었다. Win32는 최대 1670만 색상 (트루컬러) 및 최대 256×256 픽셀 크기의 아이콘 이미지 저장 기능을 도입했다.access-date=June 5, 2011 윈도우 95는 또한 새로운 DIB(Device Independent Bitmap) 엔진을 도입했다.access-date=June 6, 2011 그러나 윈도우 95의 기본 아이콘 색 깊이는 256색이었다. 레지스트리의 Shell Icon BPP 값을 수정하거나access-date=June 6, 2011 마이크로소프트 플러스! 포 윈도우 95를 구매하여 65535색 (하이컬러) 아이콘을 활성화할 수 있었다. Shell Icon Size 값은 32×32 아이콘 대신 더 큰 아이콘을 사용할 수 있도록 하며, Shell Small Icon Size 값은 16×16 아이콘 대신 사용자 정의 크기를 사용할 수 있도록 한다. 따라서 단일 아이콘 파일은 1×1 픽셀부터 256×256 픽셀(비정방형 크기 포함)까지 어떤 크기든 2(거의 사용되지 않음), 16, 256, 65535, 또는 1670만 색상으로 이미지를 저장할 수 있었지만, 셸은 매우 큰 크기의 아이콘을 표시할 수 없었다. 윈도우 작업 표시줄의 알림 영역은 기본적으로 16색 아이콘으로 제한되었지만, 윈도우 미에 이르러 하이컬러 아이콘을 지원하도록 업데이트되었다. 윈도우 XP는 32비트 색상 (1670만 색상과 8비트 알파 채널 투명도) 아이콘 이미지를 지원하여 아이콘에 그림자, 안티앨리어싱 및 유리 같은 효과와 같은 반투명 영역을 그릴 수 있게 했다. 윈도우 XP는 기본적으로 윈도우 탐색기에서 48×48 픽셀 아이콘을 사용한다. 윈도우 XP는 Shell icon size 값을 수정하여 256×256 픽셀만큼 큰 아이콘을 강제로 사용하게 할 수 있지만, 이는 셸 전체의 모든 32×32 아이콘이 확대되게 한다. 마이크로소프트는 윈도우 XP의 경우 48×48 픽셀까지만 아이콘 크기를 권장했다.access-date=2022-11-27 윈도우 XP는 더 가까운 이미지 크기가 없을 경우 더 큰 아이콘을 축소할 수 있다. 윈도우 비스타는 256×256 픽셀 32비트 색상 아이콘을 완벽하게 지원하고, 압축된 PNG 형식도 지원한다. 압축이 필수는 아니지만, 마이크로소프트는 ICO 파일의 모든 32비트 색상 256×256 아이콘을 파일 전체 크기를 줄이기 위해 PNG 형식으로 저장할 것을 권장한다. 윈도우 비스타 탐색기는 아이콘 파일에 해당 크기의 이미지가 없더라도 비표준 크기로 아이콘을 부드럽게 스케일링할 수 있으며, 이는 즉시 렌더링된다. 윈도우 비스타 셸은 아이콘 크기를 확대/축소하는 슬라이더를 추가한다. 사용자가 더 높은 해상도와 고DPI 모드를 사용함에 따라 더 큰 아이콘 형식(예: 256×256)이 권장된다.language=en-usquote=Icons have a maximum size of 256x256 pixels, making them suitable for high-dpi (dots per inch) displays. These high-resolution icons allow for high visual quality in list views with large icons... Only a 32-bit copy of the 256x256 pixel image should be included, and only the 256x256 pixel image should be compressed to keep the file size down. 윈도우의 SM_CXCURSOR 및 SM_CYCURSORGetSystemMetrics 함수 문서 시스템 메트릭은 커서의 명목상 크기를 보고하며, 일반적으로 기존 시스템에서는 32픽셀이다. 이 메트릭은 시스템에서 사용되는 모든 커서의 최대 또는 실제 크기를 반영하지 않는다. 윈도우는 일반적으로 32×32 커서를 기본적으로 로드하지만, 디스플레이 스케일링 및 해상도에 따라 48×48 또는 64×64 픽셀과 같은 다른 크기도 지원한다. 이 메트릭은 엄격한 제약이라기보다는 리소스 디자인 및 정렬에 대한 지침 값으로 사용된다. 실제 커서 크기는 특히 최신 고DPI 환경에서 달라질 수 있다. 이 메트릭은 레거시 디자인 결정에서 비롯되었으며 주로 이전 애플리케이션과의 호환성을 위해 남아있다.language=en-us
# MIME 타입
ICO 파일의 인터넷 할당 번호 관리기관에 등록된 MIME 타입은 `image/vnd.microsoft.icon`이지만,access-date=3 Jan 2014 이는 2003년에 제3자에 의해 IANA에 제출되었으며 마이크로소프트 소프트웨어에서는 인식되지 않는다. 마이크로소프트 소프트웨어는 대신 `image/x-icon` 또는 `image/ico`를 사용한다.quote="We use "image/x-icon" because that's the MIME type we've always used. Someone at some point (AFAIK, not related to Microsoft) proposed registration of the MIME type as "vnd.microsoft.icon", but Windows doesn't actually use that, it uses image/x-icon." See the second comment.Windows Imaging Component - ICO Format Overview 잘못된 형식인 `image/ico`, `image/icon`, `text/ico` 및 `application/ico`도 사용되는 것이 목격되었다.
# 아이콘 파일 구조
ICO 또는 CUR 파일은 ICONDIR("아이콘 디렉터리") 구조로 구성되어 있으며, 파일 내 각 이미지에 대한 ICONDIRENTRY 구조를 포함하고, 그 뒤에 모든 이미지 비트맵 데이터의 연속 블록(이는 BITMAPFILEHEADER 구조를 제외한 윈도우 BMP 형식 또는 전체적으로 저장된 PNG 형식일 수 있음)이 이어진다. 색상 깊이가 32비트 미만인 이미지는 특정 형식을 따른다. 이미지는 색상 마스크("XOR 마스크")와 불투명 마스크("AND 마스크")로 구성된 단일 이미지로 인코딩된다. XOR 마스크는 비트맵 데이터 내에서 AND 마스크보다 먼저 와야 한다. 이미지가 바텀업 순서로 저장된 경우(대부분 그렇다), XOR 마스크는 AND 마스크 아래에 그려진다. AND 마스크는 BMP 헤더에 지정된 색상 깊이와 관계없이 픽셀당 1비트이며, 어떤 픽셀이 완전히 투명(1)하고 어떤 픽셀이 완전히 불투명(0)한지 지정한다. XOR 마스크는 BMP 헤더에 지정된 비트 깊이를 따르며 각 픽셀의 숫자 색상 또는 팔레트 값을 지정한다. AND 마스크와 XOR 마스크는 함께 1비트 투명도를 가진 이미지를 나타내는 비투명 이미지를 만든다. 또한 배경 반전을 허용한다. ICO/CUR 파일의 ICONDIRENTRY 구조에 있는 이미지의 높이는 의도된 이미지 크기(마스크가 합성된 후)를 가지는 반면, BMP 헤더의 높이는 두 마스크 이미지가 결합된 높이(합성되기 전)를 가진다. 따라서 마스크는 각각 동일한 크기여야 하며, BMP 헤더에 지정된 높이는 ICONDIRENTRY 구조에 지정된 높이의 정확히 두 배여야 한다.language=en-US 32비트 이미지(32비트 BITMAPINFOHEADER 형식 BMP 이미지 포함기존의 BITMAPINFOHEADER 비트맵 형식은 픽셀당 32비트 이미지를 저장하는 것을 지원한다. 독립형 .BMP 파일로 저장될 때, "각 [픽셀]의 상위 바이트는 사용되지 않는다". 그러나 동일한 데이터가 ICO 또는 CUR 파일 내부에 저장될 때, 윈도우 XP (1비트 이상의 투명도를 가진 ICO/CUR 파일을 지원하는 첫 번째 윈도우 버전) 이상에서는 이 바이트를 알파 값으로 해석한다.)는 특히 알파 합성을 위한 8비트 채널이 추가된 24비트 이미지이다. 따라서 32비트 이미지에서는 AND 마스크가 필수는 아니지만, 고려하는 것이 권장된다. 윈도우 XP 이상 버전에서는 ICO/CUR 파일에 이미지의 24비트 버전이 제공되지 않는 경우, 알파 채널을 기반으로 AND 마스크를 구성하여 트루컬러 모드 미만의 32비트 이미지를 사용한다(이미지에 이미 AND 마스크가 없는 경우). 그러나 이전 버전의 윈도우는 이미지에 AND 마스크가 제공되지 않는 한 모든 픽셀을 100% 불투명으로 해석한다. 사용자 정의 AND 마스크를 제공하면 아이콘 작성자가 조작 및 힌팅을 할 수 있다. AND 마스크가 제공되지 않더라도, 이미지가 윈도우 BMP 형식인 경우 BMP 헤더는 여전히 두 배의 높이를 지정해야 한다. AND 마스크에서 비트맵의 픽셀 배열과 마찬가지로 각 행의 길이를 4바이트의 배수로 만들기 위해 패딩 바이트를 행 끝에 추가해야 한다는 점에 유의해야 한다. 이는 기본적으로 (단색) 비트맵이기 때문이다. 8x8 픽셀 비트맵의 AND 마스크는 1바이트의 데이터와 3바이트의 패딩을 가진다(8*8*1bpp = 총 64비트/8 = 8바이트, 따라서 각 행은 1바이트이고 3바이트의 패딩이 필요함). 16x16 비트맵의 AND 마스크는 2바이트의 데이터와 2바이트의 패딩을 가지며, 32x32 비트맵의 AND 마스크는 4바이트의 데이터와 패딩이 없다. 필요한 패딩 바이트의 양은 비트맵의 색상 깊이가 아닌 비트맵의 크기에 따라 달라지는데, AND 마스크는 비트맵의 크기와 관계없이 픽셀당 1비트이기 때문이다.
## 개요
ICO/CUR 파일의 모든 값은 리틀 엔디언 바이트 순서로 표현된다.
### 헤더
{| class="wikitable" |- |+ICONDIR 구조 |- ! 오프셋# ! 크기 ! 목적 |- | 0 | 2 | 예약됨. 항상 0이어야 한다. |- | 2 | 2 | 이미지 유형 지정: 아이콘(.ICO) 이미지의 경우 1, 커서(.CUR) 이미지의 경우 2. 다른 값은 유효하지 않다. |- | 4 | 2 | 파일 내 이미지 수 지정. |}
### 이미지 디렉터리 구조
{| class="wikitable" |- ! 이미지 #1 | 첫 번째 이미지에 대한 항목 |- ! 이미지 #2 | 두 번째 이미지에 대한 항목 |- | colspan="2" | ... |- ! 이미지 #n | 마지막 이미지에 대한 항목 |+ | 이미지 항목 |} {| class="wikitable" |- |+ICONDIRENTRY 구조 |- ! 오프셋# ! 크기 ! 목적 |- | 0 | 1 | 픽셀 단위 이미지 너비 지정. 0에서 255 사이의 어떤 숫자도 가능하다. 값 0은 이미지 너비가 256 픽셀임을 의미한다.윈도우 95 이후 ICONDIRENTRY structure에서 이미지의 크기를 0으로 설정할 수 있는데, 이는 256 픽셀을 의미한다. 윈도우 비스타 이후에는 이미지의 크기가 BITMAPINFOHEADER structure 또는 PNG 이미지 데이터로부터 결정되며, 이는 기술적으로 256 픽셀보다 큰 아이콘을 저장할 수 있지만, 마이크로소프트에서는 그러한 큰 크기를 권장하지 않는다. |- | 1 | 1 | 픽셀 단위 이미지 높이 지정. 0에서 255 사이의 어떤 숫자도 가능하다. 값 0은 이미지 높이가 256 픽셀임을 의미한다. |- | 2 | 1 | 색상 팔레트의 색상 수 지정. 이미지가 색상 팔레트를 사용하지 않으면 0이어야 한다. |- | 3 | 1 | 예약됨. 0이어야 한다. |- | 4 | 2 | * **ICO 형식:** 색상 평면 지정. 0 또는 1이어야 한다.색상 평면을 0 또는 1로 설정하는 것은 운영 체제에서 동등하게 처리되지만, 색상 평면이 1보다 높게 설정되면 이 값은 픽셀당 비트 수에 곱하여 이미지의 최종 색상 깊이를 결정해야 한다. 다양한 윈도우 운영 체제 버전이 다른 색상 평면 값에 대해 복원력이 있는지 여부는 알 수 없다. * **CUR 형식:** 왼쪽에서 픽셀 단위로 핫스팟의 가로 좌표 지정. quote=The cursor is loaded properly at whatever color depth the cursor was authored. However, the system cannot distinguish between multiple candidates in the same cursor file or resource that differ only by their color depths. Icons, however, fully support multiple icon candidates with varying color depths. |- | 6 | 2 | * **ICO 형식:** 픽셀당 비트 수 지정.픽셀당 비트 수는 0으로 설정될 수 있지만, 다른 데이터로부터 추론될 수 있다. 특히, 비트맵이 PNG로 압축되지 않은 경우, 비트맵 데이터의 길이를 이미지 크기에 비례하여 픽셀당 비트 수를 계산할 수 있다. 비트맵이 PNG로 압축된 경우, 픽셀당 비트 수는 PNG 데이터 내에 저장된다. 이 값이 0으로 설정될 때 다양한 윈도우 운영 체제 버전이 모든 가능성에 대한 비트 깊이를 추론하는 로직을 포함하고 있는지 여부는 알 수 없다. * **CUR 형식:** 상단에서 픽셀 단위로 핫스팟의 세로 좌표 지정. |- | 8 | 4 | 이미지 데이터의 크기(바이트) 지정 |- | 12 | 4 | ICO/CUR 파일 시작점으로부터 BMP 또는 PNG 데이터의 오프셋 지정 |}
### 참조된 이미지 데이터
이미지 디렉터리의 항목이 참조하는 모든 이미지 데이터는 이미지 디렉터리 바로 다음에 이어진다. 이미지 디렉터리에 정의된 순서와 동일한 순서로 저장하는 것이 일반적인 관행이다.
### BMP 형식
이미지가 BMP 형식으로 저장된 경우, 시작 BITMAPFILEHEADER structure는 제외해야 한다. BMP 이미지의 높이는 이미지 디렉터리에 선언된 높이의 두 배여야 한다. 이는 실제 이미지 데이터가 두 부분으로 구성되기 때문이다. 실제 이미지 뒤에 바로 이어지는 이미지와 동일한 크기의 1비트 마스크가 그려질 픽셀을 결정하는 데 사용된다. 마스크는 DWORD (32비트)에 정렬되어야 하며 0으로 채워져야 한다. 0 픽셀은 '이미지의 해당 픽셀이 그려질 것'을 의미하고, 1은 '이 픽셀을 무시할 것'을 의미한다. 픽셀 색상은 24비트 및 32비트 버전(색상 테이블 없음)의 경우 명시적으로 지정되며, 다른 깊이(1,2,4,8,16)의 경우 BITMAPINFOHEADER 뒤에 오는 4바이트(BGRA) 색상 테이블에서 인덱싱된다. 1비트의 경우, 일반적으로 두 색상은 #00000000 및 #00FFFFFF이며 A 채널은 무시된다. 1,2,4,8 및 16비트의 픽셀 데이터는 바이트 단위로 묶여 있고 DWORD 정렬된다. 24비트 이미지는 B G R 삼중으로 저장되지만 DWORD 정렬되지 않는다. 32비트 이미지는 B G R A 사중으로 저장된다. 원래 ICO와 CUR은 단색 디스플레이에서 사용하기 위한 것이었으며 1=Output = (Existing AND Mask) XOR Image 공식을 사용했지만, 컬러 화면에서는 A 채널 블렌딩을 사용하여 커서가 구성되고 마스크는 어떤 픽셀이 포함되거나 제외될지 결정하는 데 사용된다.
### PNG 형식
이미지가 PNG 형식으로 저장된 경우, BITMAPINFOHEADER는 없고 PNG 이미지의 내용 전체가 대신 사용된다. ICO 형식 이미지에서 PNG 이미지를 읽을 수 있는 기능은 윈도우 비스타에서 도입되었다. PNG 이미지는 표준 윈도우 BMP 형식 이미지와 동일한 방식으로 이미지에 저장될 수 있으며, PNG 이미지는 파일 헤더와 함께 32bpp ARGB 형식으로 전체가 저장되어야 한다는 점만 예외이다. 참고: CUR 파일은 PNG 이미지 데이터를 사용할 수 없으며 ICO와 마찬가지로 BMP 이미지 데이터를 사용해야 한다.
# 아이콘 및 커서 리소스
PE 포맷 (EXE 또는 DLL) 파일의 아이콘과 커서는 RT_GROUP_ICON, RT_GROUP_CURSOR, RT_ICON 및 RT_CURSOR 유형의 리소스로 구성된다.language=en-us RT_GROUP_ICON 및 RT_GROUP_CURSOR 리소스는 NEWHEADER 구조와 하나 이상의 RESDIR 구조를 포함하며, 이들은 ICO/CUR 파일의 해당 ICONDIR 및 ICONDIRENTRY 구조와 거의 동일한 형식을 갖는다. 주요 차이점은 RESDIR에서 구조의 마지막 멤버가 파일의 이미지 오프셋 대신 RT_ICON/RT_CURSOR의 2바이트 리소스 식별자를 포함한다는 것이다. NEWHEADER/RESDIR 구조는 많은 자료에서 GRPICONDIR/GRPICONDIRENTRY로도 불린다.language=en-us {| class="wikitable" |- |+ NEWHEADER 구조 |- ! 오프셋# ! 크기 ! 목적 |- | 0 | 2 | 예약됨. 항상 0이어야 한다. |- | 2 | 2 | 리소스 유형 지정: 아이콘 리소스의 경우 1, 커서 리소스의 경우 2. 다른 값은 유효하지 않다. |- | 4 | 2 | NEWHEADER 구조 바로 뒤에 오는 RESDIR 구조의 개수 지정. |} {| class="wikitable" |- |+RESDIR 구조 |- ! 오프셋# ! 크기 ! 목적 |- | rowspan="2" | 0 | **아이콘의 경우:** 1 | rowspan="2" | * 픽셀 단위 이미지 너비 지정. 0에서 255 사이의 어떤 숫자도 가능하다. 값 0은 이미지 너비가 256 픽셀임을 의미한다. |- | **커서의 경우:** 2 |- | rowspan="2" | 2 | **아이콘의 경우:** 1 | rowspan="2" | * 픽셀 단위 이미지 높이 지정. 0에서 255 사이의 어떤 숫자도 가능하다. 값 0은 이미지 너비가 256 픽셀임을 의미한다. |- | **커서의 경우:** 2 |- | 2 | 1 | * **아이콘 리소스의 경우:** 색상 팔레트의 색상 수 지정. 이미지가 색상 팔레트를 사용하지 않으면 0이어야 한다. |- | 3 | 1 | * **아이콘 리소스의 경우:** 예약됨. 0이어야 한다. |- | 4 | 2 | 색상 평면 지정. 0 또는 1이어야 한다. |- | 6 | 2 | 픽셀당 비트 수 지정. |- | 8 | 4 | 리소스 크기(바이트) 지정. |- | 12 | 2 | RT_ICON 또는 RT_CURSOR 리소스의 고유 서수 식별자. |} RT_ICON 및 RT_CURSOR 리소스는 ICO 파일과 동일한 이미지 데이터 형식을 가지며 PNG 이미지도 저장할 수 있다. 추가적으로, RT_CURSOR 리소스 데이터의 처음 4바이트에는 두 개의 WORD (16비트) 값으로 커서 핫스팟 데이터가 포함된다(CUR 파일과 달리 핫스팟 데이터는 ICONDIRENTRY 구조에 포함됨).language=en-us
# 아이콘 라이브러리
**아이콘 라이브러리**는 윈도우 아이콘을 패키징하는 방법이다. 일반적으로 .ICL 확장자를 가진 16비트 New Executable 또는 32비트 PE 포맷 바이너리 파일이며, 아이콘 리소스가 패키징된 아이콘이다. 윈도우 비스타 및 이후 버전은 16비트 (New Executable) 파일의 아이콘 보기를 지원하지 않는다.access-date=November 27, 2022