사진 한 장의 데이터 구조를 이해하려면, **이미지 파일**이 **이진수(0과 1)**로 어떻게 구성되는지 살펴보아야 합니다. 여기서는 일반적인 **비트맵 이미지 파일(Bitmap, BMP)**을 예로 들어 설명하겠습니다. 비트맵 이미지 형식은 이미지를 픽셀 단위로 저장하며, 각 픽셀의 색상 정보를 이진수로 표현합니다. ### 1. **이미지 파일의 구조** 비트맵 이미지 파일의 구조는 크게 다음과 같은 **헤더**와 **픽셀 데이터**로 나눌 수 있습니다: - **파일 헤더**: 파일의 기본 정보(파일 크기, 이미지 크기, 파일 형식 등)가 들어갑니다. - **이미지 헤더**: 이미지의 해상도, 색상 깊이, 압축 정보 등이 포함됩니다. - **픽셀 데이터**: 실제 이미지의 **픽셀 정보**가 들어 있습니다. 각 픽셀은 이미지의 각 점(사각형)을 나타내며, **RGB 색상 값**(빨강, 초록, 파랑)을 이진수로 표현합니다. ### 2. **비트맵 이미지 파일 구조 예시** #### 예: 4x4 픽셀의 작은 비트맵 이미지 (24비트 RGB, 압축 없음) 이 예시에서는 간단한 4x4 크기의 비트맵 이미지를 사용하여, 어떻게 데이터를 구성하는지 설명해보겠습니다. **24비트 비트맵(BMP)** 이미지는 각 픽셀당 24비트(3바이트)를 사용하여 RGB 색상을 표현합니다. #### 2.1 **파일 헤더** - **파일 타입**: 2바이트 (`0x42 0x4D`, "BM"으로 표현되며, BMP 파일을 나타냅니다) - **파일 크기**: 4바이트 (전체 파일의 크기, 예를 들어 118바이트라고 가정) - **픽셀 데이터 오프셋**: 4바이트 (픽셀 데이터가 파일 내에서 시작하는 위치, 예: 54바이트) #### 2.2 **이미지 헤더** - **헤더 크기**: 4바이트 (헤더 크기, 예: 40바이트) - **이미지 너비**: 4바이트 (이미지의 너비, 예: 4픽셀) - **이미지 높이**: 4바이트 (이미지의 높이, 예: 4픽셀) - **색상 평면**: 2바이트 (항상 1) - **비트 깊이**: 2바이트 (픽셀당 비트 수, 예: 24비트) - **압축**: 4바이트 (압축 방식, 예: 0, 압축 없음) #### 2.3 **픽셀 데이터** **픽셀 데이터**는 각 픽셀의 색상 값을 **RGB 형식**으로 저장합니다. 24비트 비트맵에서는 각 픽셀당 **3바이트**(8비트씩 총 24비트)를 사용하여 **파랑(B)**, **초록(G)**, **빨강(R)** 순서로 색상 값을 저장합니다. 여기서는 예시로, 4x4 픽셀의 작은 이미지를 다룹니다: #### 픽셀 데이터 예시: | 위치 | 픽셀 색상 값 (RGB) | 16진수 값 | 이진수 값 | |------|--------------------|-----------|-----------| | (0,0)| 빨강(255, 0, 0) | `0x00 0x00 0xFF` | `00000000 00000000 11111111` | | (0,1)| 초록(0, 255, 0) | `0x00 0xFF 0x00` | `00000000 11111111 00000000` | | (0,2)| 파랑(0, 0, 255) | `0xFF 0x00 0x00` | `11111111 00000000 00000000` | | (0,3)| 흰색(255, 255, 255) | `0xFF 0xFF 0xFF` | `11111111 11111111 11111111` | | (1,0)| 검정(0, 0, 0) | `0x00 0x00 0x00` | `00000000 00000000 00000000` | | ... | ... | ... | ... | #### 픽셀 데이터 설명: - **(0,0) 위치의 픽셀**은 빨간색(RGB 값: 255, 0, 0)으로, 이는 16진수로 `0x00 0x00 0xFF`입니다. 이를 이진수로 표현하면 `00000000 00000000 11111111`가 됩니다. - **(0,1) 위치의 픽셀**은 초록색(RGB 값: 0, 255, 0)으로, 16진수로 `0x00 0xFF 0x00`이며, 이진수로는 `00000000 11111111 00000000`입니다. - 이렇게 모든 픽셀의 RGB 값을 이진수로 변환하여 저장합니다. ### 3. **이미지 파일의 이진 표현** 이미지 파일은 결국 **0과 1로 이루어진 이진 데이터**로 저장됩니다. 예를 들어, 위에서 본 **빨강색 픽셀**은 이진수로 다음과 같이 저장됩니다: - 빨강색 픽셀(255, 0, 0): `00000000 00000000 11111111` 각 픽셀의 색상 값은 이렇게 **이진수**로 변환되어 저장되고, 이를 통해 컴퓨터는 이미지 파일을 읽고 화면에 해당 색상을 표시할 수 있습니다. ### 4. **압축된 이미지 형식 (JPEG, PNG 등)** - 위에서 설명한 **비트맵 이미지(BMP)**는 압축을 하지 않은 형태이기 때문에 데이터가 그대로 저장됩니다. - **JPEG**나 **PNG**와 같은 압축된 이미지 포맷은, 효율적으로 데이터를 압축하는 방식을 사용합니다. 이 과정에서도 이미지의 픽셀 데이터를 압축 알고리즘을 통해 더 작은 크기로 변환한 후, **0과 1로** 표현합니다. - 예를 들어, JPEG는 이미지의 색상 정보를 손실 압축하여 파일 크기를 줄이는 방식이며, PNG는 무손실 압축을 사용합니다. 하지만 이들 역시 최종적으로는 이진 데이터로 변환되어 저장됩니다. ### 5. **요약** 사진 한 장의 데이터는 다음과 같은 구조로 이루어집니다: - **파일 헤더**: 파일 크기, 형식, 해상도 등 메타 정보 - **이미지 헤더**: 이미지의 해상도, 색상 깊이, 압축 정보 - **픽셀 데이터**: 각 픽셀의 RGB 색상 값이 **이진수(0과 1)**로 저장 컴퓨터는 이 **이진 데이터**를 해석하여 화면에 이미지를 표시하거나, 이미지 파일을 저장하고 전송할 수 있게 됩니다.