반응형
🖼️ 픽셀 포맷에 따른 이미지 메모리 구조와 Stride 기반 메모리 할당 정리
이미지 데이터를 처리할 때는 픽셀 포맷(PixelFormat)에 따라 픽셀당 바이트 수가 달라지며, 정확한 메모리 할당을 위해서는 Stride(스캔라인의 바이트 정렬) 개념도 반드시 고려해야 합니다.
📌 픽셀 포맷별 바이트 수
픽셀 포맷은 하나의 픽셀이 메모리에서 차지하는 비트 수를 정의하며, 이로 인해 픽셀당 바이트 수(n)가 결정됩니다.
PixelFormat 설명 바이트 수 (n)
Format8bppIndexed | 8비트 (256 색상) 인덱스 참조 | 1 byte |
Format24bppRgb | 24비트 RGB (Red, Green, Blue) | 3 bytes |
Format32bppArgb | 32비트 ARGB (Alpha, Red, Green, Blue) | 4 bytes |
✅ 포맷별 차이 설명
- 8bpp (1 byte/pixel)
팔레트를 참조하는 색상 인덱스만 저장 → 공간 효율적이지만 제한된 색상 수. - 24bpp (3 bytes/pixel)
각 픽셀이 Red, Green, Blue 세 가지 색상 정보를 가짐 → 일반적인 컬러 이미지. - 32bpp (4 bytes/pixel)
RGB에 투명도(Alpha)를 추가로 저장 → ARGB 표현 가능.
⚠️ Stride(스트라이드)의 개념과 필요성
- Stride는 메모리에서 이미지 한 줄(스캔라인)이 차지하는 총 바이트 수입니다.
- 대부분 시스템에서 메모리는 **4바이트 정렬(alignment)**을 요구합니다.
- 따라서 (nWidth * bytesPerPixel)만큼 할당하는 것보다, 아래처럼 정렬된 Stride로 메모리를 할당해야 안정적입니다.
Stride 계산 공식:
int stride = ((nWidth * bytesPerPixel + 3) / 4) * 4;
🧠 올바른 메모리 할당 방식 예제
int bytesPerPixel = ...; // 픽셀 포맷에 따라 1, 3, 4
int stride = ((nWidth * bytesPerPixel + 3) / 4) * 4;
IntPtr imageBuffer = Marshal.AllocHGlobal(stride * nHeight);
이 방식은 특히 GDI+ Bitmap.LockBits()나 이미지 처리 라이브러리에서 Bitmap 객체를 메모리로부터 생성할 때 필수적입니다.
반응형
'image...' 카테고리의 다른 글
OpenCvSharp을 사용하여 CV_8UC3에서 CV_8UC4로 변환하는 방법 (0) | 2023.12.17 |
---|---|
비트맵 한 줄의 바이트 수를 4의 배수로 맞추는 방법: (K + 3) & ~3 연산 (0) | 2023.06.24 |