Microprocessor/STM32 Open103V(STM32F103VET) 비트맵 파일 다루기
  • 728x90
    반응형

    비트맵 파일 포맷





    개요



    Open103V 패키지의 TFT(ILI9325) LCD에 비트맵 이미지를 출력하기 위해 16-bit Interface를 지원하는 TFT에 맞게 16비트 비트맵에 대하여 알아볼 필요가 있다.



    비트맵 파일 포맷



    비트맵 파일은 픽셀 하나를 몇 비트로 저장하느냐에 따라 구조가 달라진다. TFT에 출력을 위하여 16비트 비트맵을 사용하였다. 아래는 비트맵 파일의 구조이다.



    비트맵 파일 헤더는 비트맵 파일 식별 정보, 파일 크기, 데이터 위치 등의 정보를 담고 있으며 DIB(Device Independent Bitmap) 헤더는 가로, 세로 크기, 해상도, 픽셀의 비트 수 등 그림의 자세한 정보를 담고 있다.


    픽셀 데이터에는 그림 파일의 실제 색상 정보가 들어간다. 단, 픽셀당 색상 수가 16비트 미만일 때는 색상 테이블에 따로 색상 정보를 저장하고, 픽셀 데이터에서는 색상 테이블의 인덱스를 저장한다. TFT 16색 비트맵 파일을 사용할 것이므로 색상 테이블은 처리하지 않는다.


    아래는 비트맵 파일 헤더(BITMAPFILEHEADER)의 구조이다.


    멤버

    크기(Byte)

    설명

    bfType

    BMP 파일 매직 넘버. 비트맵 파일이 맞는지 확인하는데 사용하며 ASCII 코드로 0x42(B), 0x4D(M)가 저장된다.

    bfSize 

    파일 크기(바이트) 

    bfReserved1 

    현재는 사용하지 않으며 미래를 위해 예약된 공간 

    bfReserved2 

    현재는 사용하지 않으며 미래를 위해 예약된 공간 

    bf0ffBits 

    비트맵 데이터의 시작 위치 


    다음은 비트맵 정보 헤더(BITMAPINFOHEADER)의 구조이다.

    멤버

    크기(Byte)

    설명

    bitSize

    현재 비트맵 정보 헤더(BITMAPINFOHEADER)의 크기 

    biWidth 

    비트맵 이미지의 가로 크기(픽셀) 

    biHeight 

    비트맵 이미지의 세로 크기(픽셀) 

      - 양수 : 이미지의 상하가 뒤집혀서 저장된 상태

      - 음수 : 이미지가 그대로 저장된 상태

    보통 세로 크기는 양수로 저장되어 있다.

    biPlanes 

    사용하는 색상판의 수. 항상 1이다. 

    biBitCount 

    픽셀 하나를 표현하는 비트 수

    bitCompression

    압축 방식. 보통 비트맵은 압축을 하지 않으므로 0이다. 

    biSizeImage

    비트맵 이미지의 픽셀 데이터 크기(압축 되지 않은 크기)

    biXPelPerMeter

    그림의 가로 해상도(미터당 픽셀) 

    biYPelsPerMeter

    그림의 세로 해상도(미터당 픽셀) 

    biClrUsed

    색상 테이블에서 실제 사용되는 색상 수 

    biClrImportant

    비트맵을 표현하기 위해 필요한 색상 인덱스 수 


    16비트 비트맵은 픽셀(RGBTRIPLE)을 파랑(B), 초록(G), 빨강(R) 순서로 저장하며 각 색상의 크기는 RGB(5:6:5) 비트 포맷이다. 


    아래는 16비트 비트맵의 픽셀 구조이다.


    멤버

    크기(Byte)

    설명

    rgbtBlue

    파랑

    rgbtGreen

    1

    초록

    rgbtRed

    빨강


    즉, 화면에서 보는 16비트 비트맵 파일의 픽셀은 2바이트로 되어 있다.

    위에서 색상이 파랑, 초록, 빨강 3색이라서 RGBTRIPLE 구조체의 이름에 triple이 들어간다. 그리고 구조체 멤버에서 rgb 뒤에 붙는 t도 triple을 의미한다.



    TFT(ILI9325) LCD 16bit BMP 출력



    BMP 이미지 파일은 알씨를 사용해서 크기 및 포맷형식을 쉽게 변경할 수 있다. 16비트를 지원하는 LCD를 사용할 경우 16bit BMP 파일을 이용하면 출력 속도도 상당히 빨라지고 처리도 간단해 진다.


    보통 16비트 이미지는 RGB(5:6:5) 포맷을 많이 사용하는데(현재 사용하는 TFT LCD는 5:6:5 포맷을 사용한다) SD카드에 저장 후 이미지를 출력해 보니 색상이 이상하게 나타났다.


    RGB(5:6:5) 포맷


    파일을 읽어보니 5:6:5가 아닌 5:5:5로 저장되어 있다.

    HxD 에디터로 보면 흰색 이미지가 FF 7F로 저장되어 있다. FAT에서 실제 값은 리틀엔디언으로 0x7FFF 이고 최상위 비트 하나가 빠진 5:5:5 포맷으로 되어 있다.



    실제 저장된 RGB(5:5:5) 포맷


    따라서 R, G 값을 한비트 시프트 해서 출력하면 문제없이 동작한다.


    R, G 값을 시프트한 RGB(5:5:5) 포맷


    ILI9325 TFT-LCD에 16bit BMP 이미지 출력 결과




    728x90
    반응형

    'Microprocessor > STM32' 카테고리의 다른 글

    TLC5947 24-Channel, 12-Bit PWM LED Driver  (0) 2019.02.21
    애노드와 캐소드 차이점(Anode Cathod)  (0) 2019.02.20
    STM32F130C8T6 (feat.TDCR1050M FND)  (0) 2018.11.19
    nRF51422-QFAB(GPIO/ADC)  (0) 2018.11.01
    MPU-9250 Module  (2) 2016.12.12
상단으로