디지털 이미지의 작동원리 알아보기 ( Bitmap 분석 )

개발하는자·2022년 3월 26일
1

파일

목록 보기
1/1
post-thumbnail
  1. 이미지
  2. 디지털 이미지
  3. 디지털 이미지 종류
  4. 비트맵 깊게 알아보기

이번 게시글에서는 이미지가 무엇인지와 실제 비트맵 이미지를 통해 디지털 이미지의 원리에 대해서 공부해 보겠습니다.



1. 🖼 이미지

이미지는 사람 또는 사물 등 무언가를 눈으로 볼 수 있게 나타낸것 입니다.









2. 📁 디지털 이미지

디지털 이미지는 그래픽, 그림 등 시각 정보를 이진으로 나타내어 컴퓨터에서 사람이 볼 수 있게 나타낸 파일입니다. 디지털 이미지는 모든 저장 장치에 저장할 수 있습니다.

2.1 픽셀

픽셀은 디지털 디스플레이 장치에 표시할 수 있는 가장 작은 단위입니다. 지금 보고 있는 화면은 모두 픽셀로 이루어져 있습니다. 그래픽 카드 및 모니터 사양에 따라 컴퓨터 디스플레이 해상도가 결정됩니다. 1280 x 768인 컴퓨터는 디스플레이 화면에 최대 98,3040픽셀을 생성합니다.







3. ❓ 디지털 이미지 종류

디지털 이미지를 그대로 저장하게 되면 효율성이 좋지 않아 보통 압축을 하여 저장하게 됩니다. 압축 종류는 손실 압축비 손실 압축이 있으며 손실 압축은 원래 상태로 되돌릴 수 없으며 비손실 압축은 원래 상태로 되돌릴 수 있습니다.



◾️ BMP

BMP는 Windows에서 장치 독립 및 응용 프로그램 독립 이미지를 저장하는 데 사용하는 표준 형식입니다. 주어진 BMP 파일에 대한 픽셀당 비트 수(1, 4, 8, 15, 24, 32 또는 64)는 파일 헤더에 지정됩니다. 픽셀당 24비트의 BMP 파일이 일반적입니다. BMP 파일은 일반적으로 압축되지 않으므로 인터넷을 통한 전송에 적합하지 않습니다.

- 예시 -

비트맵에서 FFFFFF는 흰색, FF0000은 빨간색, 00FF00은 녹색, 0000FF는 파란색을 나타냅니다.



◾️ JPG/JPEG

jpeg는 비트맵 방식의 이미지 압축 표준 중 하나입니다. 손실 압축으로 압축률을 높힐경우 이미지 상태가 안좋아지는 단점이 있습니다. 하지만 사람 눈으로 인식할 수 없는 경우가 많습니다.

jpeg는 픽셀당 24비트를 저장하므로 1600만 개 이상의 색상을 표시할 수 있습니다.

- 예시 -

본래 jpeg 였으나 도스에서 확장자를 최대 3자까지 밖에 사용을 못하여 jpg로도 사용하게 되었습니다. 둘다 같은 파일 방식입니다.



◾️ PNG

특허 문제가 있는 GIF 포맷의 문제를 해결하고 개선하기 위해서 고안되었습니다. 비손실 압축 방식으로 손상없이 원래 상태로 복원할 수 있습니다.



◾️ GIF

1987년 컴퓨서브가 발표하였으며 웹에서 널리 쓰이는 압축 방식입니다. 비손실 압축 방식을 사용합니다.




.
.
.
등 디지털 이미지를 저장하는 방법은 많이 있습니다. 이 게시글에서 디지털 이미지 종류를 자세히 다루지는 않겠습니다.







4. 비트맵 깊게 알아보기

비트맵은 행렬로 구성된 디지털 이미지입니다. 컴퓨터에 디지털 이미지를 저장하는 데 사용하는 이미지 형식 중 하나입니다. 특히 마이크로소프트 윈도우, OS/2 운영 체제에 널리 쓰입니다.

비트맵 파일 형식에는 여러 가지가 있습니다 . 압축되지 않은 표준 비트맵 형식은 "BMP" 형식 또는 DIB(장치 독립 비트맵) 형식이라고도 합니다. 여기에는 이미지의 크기와 이미지에 포함될 수 있는 색상 수를 정의하는 헤더와 해당 색상이 있는 픽셀 목록이 포함됩니다.





🖼 샘플 이미지 (girl.bmp)







📃 데이터 블록 ( .bmp => hex )

위 사진은 girl.bmp 파일을 헥사값으로 변경한 이미지입니다. 파란색 배경이 헤더와 비트맵 정보를 나타냅니다.
( 위 이미지에서는 일부만 나온것이며 실제로 263,222개의 HEX값이 있습니다. )

헥사코드란?
=> 16진수








🔬 헤더 분석

참고


빅 인디언 방식과 리틀 인디언 방식의 지식이 필요합니다.
( 헤더는 리틀 인디언 방식을 사용 )
ex) 00 01 00 00 => 00 00 01 00



👉 BMP 헤더 - BMP 파일에 대한 일반 정보를 담고 있다.

이 바이트 블록은 파일의 시작 부분에 있으며 파일을 식별하는 데 사용됩니다. 일반적인 응용 프로그램은 파일이 실제로 BMP 파일이고 손상되지 않았는지 확인하기 위해 먼저 이 블록을 읽습니다

✅ 위 사진에서의 빨간색 드래그 부분입니다.



0 ~ 2 : BMP 파일을 식별하는 데 쓰이는 매직 넘버: 0x42 0x4D (B와 M에 대한 ASCII 코드 포인트)

42 4D : BM 으로 비트맵을 나타냅니다.


2 ~ 4 : BMP 파일 크기 (바이트 단위)

36 04 04 00 : Little Endian방식으로 되어있으므로 "00 04 04 36" => 263,222bytes


6 ~ 2 : 예약필드. 실제값은 그림을 만든 데 쓰인 응용 프로그램에 따라 달라진다.


8 ~ 2 : 예약필드. 실제값은 그림을 만든 데 쓰인 응용 프로그램에 따라 달라진다.


10 ~ 4 : 비트맵 데이터를 찾을 수 있는 시작 오프셋 (바이트 단위)

36 04 00 00 : 1078bytes





👉 비트맵 정보(DIB 헤더) - 비트맵 그림에 대한 자세한 정보를 담고 있다.

이 바이트 블록은 화면에 이미지를 표시하는 데 사용되는 이미지에 대한 자세한 정보를 애플리케이션에 알려줍니다.

✅ 위 사진에서의 파란색 드래그 부분입니다.



14 ~ 4 : 이 헤더의 크기 (40 바이트)

28 00 00 00 : 40bytes


18 ~ 4 : 비트맵 가로 (단위는 화소, signed integer).

00 02 00 00 : 512


22 ~ 4 : 비트맵 세로 (단위는 화소, signed integer).

00 02 00 00 : 512


26 ~ 2 : 사용하는 색 판(color plane)의 수. 1로 설정해야 한다.

01 00 : 1


28 ~ 2 : 한 화소에 들어가는 비트 수이며 그림의 색 깊이를 뜻한다. 보통 값은 1, 4, 8, 16, 24, 32이다.

08 00 : 8

픽셀당 비트수 : 8bpp


30 ~ 4 : 압축 방식. 가능한 값에 대한 목록은 다음 표를 참조하라.

00 00 00 00 : 0


34 ~ 4 그림 크기. 압축되지 않은 비트맵 데이터의 크기(아래 참조)이며, 파일 크기와 혼동하지 말 것.

00 00 04 00 : 262,144


38 ~ 4 그림의 가로 해상도. (미터 당 화소, signed integer)


42 ~ 4 그림의 세로 해상도. (미터 당 화소, signed integer)


46 ~ 4 색 팔레트의 색 수, 또는 0에서 기본값 2n.

00 01 00 00 : 256


50 ~ 4 중요한 색의 수. 모든 색이 중요할 경우 0. 일반적으로 무시.

00 00 00 00





🟧 색상 테이블

10 ~ 4 내용을 보시면 시작 오프셋이 1078bytes 인것을 확인 할 수 있습니다.

1078 - (14+40) 시작 오프셋 - ( 헤더 + 정보 ) : 1024bytes 입니다.


이 1024bytes는 색상 테이블 정보입니다.

위 사진은 4바이트 RGBA32 형식으로 총 256개의 색상이 있으며 각 색상은 4바이트를 차지하여 총 256 * 4 : 1024bytes입니다.

ex) rgba(44, 44, 44, 0)



색상표는 일반적으로 픽셀이 16비트/픽셀(16bpp) 형식(이상)일 때 사용되지 않습니다. 일반적으로 해당 비트맵 이미지 파일에는 색상표 항목이 없습니다. 그러나 Microsoft 문서에 따르면 16bpp(이상)의 경우 제한된 장치에서 최적화를 위한 색상 목록을 저장하기 위해 색상표가 표시될 수 있습니다.





👉 지금까지 헤더, 비트맵 정보 및 색상 테이블을 알아보았습니다. 위 정보를 통해 1078bytes 부터 1바이트에 1픽셀로 색상 테이블을 통해 나태내면 실제 이미지를 만들 수 있습니다. 👈





🔬 실제 이미지 분석



(1) 이미지 한줄 분석


1️⃣ 10 ~ 4 : 비트맵 데이터를 찾을 수 있는 시작 오프셋 (바이트 단위) : 1078bytes

1078 비트 부터 비트맵 색상 정보를 확인할 수 있습니다.


2️⃣ 28 ~ 2 : 한 화소에 들어가는 비트 수이며 그림의 색 깊이를 뜻한다. 보통 값은 1, 4, 8, 16, 24, 32이다. : 8bit

1byte


3️⃣ 18 ~ 4 : 비트맵 가로 (단위는 화소, signed integer) : 512bytes

이미지 한줄에 512bytes




위 정보들을 통해 1590bytes(1078 + 512 = 1590)로 이미지 1줄을 만들 수 있다는것을 확인했습니다.




➡️ 1590bytes => Image ( 이미지 한줄 )





(2) 약 절반 정도 이미지 분석

이미지의 헥사코드를 아래부터 절반 정도 제거를 하여 이미지로 나타냈습니다.




💡 그런데 어째서 이미지가 위에서부터 잘려서 나올까요?

비트맵 정보 헤더의 이미지 높이는 양수이므로 파일의 비트맵 데이터 순서는 줄 순서대로 왼쪽 하단 모서리에서 오른쪽 상단 모서리까지입니다. 즉, 우리가 보는 첫 번째 픽셀은 이미지의 왼쪽 하단 모서리에 있는 데이터입니다.




정리

이미지와 디지털 이미지가 무엇인지 알아보고 비트맵 이미지를 헥사 코드로 바꿔 BMP 헤더, 비트맵 정보(DIB 헤더), 색상 테이블을 알아 보았고 실제 이미지를 분석 해봤습니다.









- 참고 링크 -

techopedia - pixel
https://www.techopedia.com/definition/24012/pixel

microsoft - Types of Bitmaps
https://docs.microsoft.com/en-us/dotnet/desktop/winforms/advanced/types-of-bitmaps?view=netframeworkdesktop-4.8#:~:text=A%20bitmap%20is%20an%20array,be%20assigned%20to%20that%20pixel.

BBC - digital images
https://www.bbc.co.uk/bitesize/topics/zf2f9j6/articles/z2tgr82

techterms - Bitmap
https://techterms.com/definition/bitmap

wikipedia - BMP 파일 포맷
https://ko.wikipedia.org/wiki/BMP_%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7

katastros - Detailed explanation of BMP file format
https://blog.katastros.com/a?ID=00550-44115673-da75-4bdd-b18b-92f0960484e2

codepen - Hex to image
https://codepen.io/abdhass/full/jdRNdj

Hex converter
https://www.scadacore.com/tools/programming-calculators/online-hex-converter/

Window Bitmap File Loader
http://www.kalytta.com/bitmap.h

profile
To the moon.

0개의 댓글