이미지 픽셀 비트와 그래픽 처리 과정 중 비트 크기 차이
1. 이미지 파일의 비트 표현
이미지 파일을 읽어오면 일반적으로 각 픽셀을 8비트(1바이트)로 표현하는 경우가 많습니다. 이는 그레이스케일(흑백) 이미지나, 각 색상 채널(Red, Green, Blue)을 8비트로 나타내는 컬러 이미지에서 주로 사용됩니다. 즉, **1픽셀 당 8비트(256단계)**로 각 색상이나 밝기 값을 표현하는 것이죠. 주로 가져올 때 unsigned char로 가져옵니다. unsigned char는 8비트이기 때문입니다.
2. 32비트로 변환하는 이유
이미지를 8비트에서 32비트로 변환하는 이유는 이미지 처리나 그래픽 처리 과정에서 주로 RGBA (Red, Green, Blue, Alpha) 형식을 사용하기 때문입니다. 여기서 Alpha는 투명도를 나타내는 값입니다.
- R, G, B, A 각 채널이 8비트로 표현되며, 4개의 채널이므로 1픽셀 당 총 32비트가 됩니다.
이미지 처리 중에 32비트로 변환하면 각 채널에 개별적으로 색상, 밝기 조정, 블렌딩, 필터링 등 다양한 연산을 쉽게 적용할 수 있습니다. 특히, 컴퓨터 그래픽스 분야에서는 각 채널을 독립적으로 처리해야 할 때가 많기 때문에 이런 방식을 사용합니다.
3. 다시 8비트로 변환하는 이유
처리된 이미지를 다시 저장할 때는, 저장 공간을 절약하기 위해 8비트 형식으로 다시 변환하는 경우가 많습니다. 대부분의 이미지 포맷(JPEG, PNG 등)은 최종적으로 8비트 형식을 지원하며, 투명도가 필요 없는 이미지라면 Alpha 채널도 제거되고 RGB 채널만 남게 됩니다. 이는 파일 크기를 줄이고 호환성을 높이기 위함입니다. 8비트로 변환시 안정성을 고려하여 앞에 uint8_t을 붙여줍니다.
4. 언제 8비트에서 32비트로 변환하는가?
- 이미지 처리를 할 때: 연산의 복잡성을 고려해 32비트로 변환해 개별 채널에 대해 연산을 수행한 후 다시 저장할 때는 8비트로 변환.
- 그래픽스 엔진에서: DirectX나 OpenGL 같은 그래픽스 API에서 렌더링을 할 때, 픽셀의 각 색상 채널을 32비트로 처리해 높은 퀄리티의 이미지 연산을 가능하게 함.
결론적으로, 이런 8비트-32비트 변환은 이미지 처리 중 자주 발생하는 일반적인 과정입니다.
추가적으로 unsigned char를 썼다가 다시 저장할 때 uint8_t로 쓴다고 하였는데, 사실 둘은 똑같은 자료형입니다. 하지만 unsigned char는 뭔가 문자를 저장해야할 것 같은 느낌 때문에 가독성을 위해 uint8_t를 쓰는 것을 선호합니다.