본문 바로가기
코스웨어/15년 스마트컨트롤러

20151106 출석번호 9번 김태현 비트맵파일 분석

by 알 수 없는 사용자 2015. 11. 6.
728x90
반응형

비트맵

 

점 한 개에 1byte는 흑백을 의미하기 때문에 컬러로 나오는건 점하나당 byte가 틀리다.

 


160000400*400 픽셀의 1byte 크기 즉 흑백일 때 크기이고

컬러는 RGB 세개의 색의 조합이기 때문에 160000*3을 해서 480000이 크기이다.

54byte는 비트맵헤더가 들어가는데 이를 오버헤더라고 부른다.(※오버헤더는 실제 데이터 외의 데이터를 오버헤더라 한다.)

디스크 할당은 디스크 조각에 맞춰서 나오기 때문에 크기랑 같거나 크다

 

비트맵 헤더는 단일 구조체로 되어 있는게 아니고 여러개의 구조체가 모여서 헤더를 구성한다 위의 두개가 합쳐서 54byte를 차지한다

그림을 흰색으로 했기 때문에 상위 54바이트의 헤더를 빼고는 모두 FF로 채워져 있는걸 확인할수 있다.


데이터에 FF중 하나를 0으로 만들어서 RGB 색중 하나로 채워지게 만들어보자.


소스


#include <stdio.h>
#include
 <fcntl.h>
#include <windows.h>


int main(int iNum, char * cpArr[])
{
  int iRtn;
  int iFd;
  BITMAPFILEHEADER stBFHead;
  BITMAPINFOHEADER stBIHead;
  char cBuf[16*16];
  unsigned char * ucpBuf;
  
  unsigned int uiCntX;
  unsigned int uiCntY;

  

  iFd = open(cpArr[1], O_RDWR|O_BINARY);  
  if(iFd == 0)
  {
    printf("파일을 열 수 없습니다.\n");
    return -1;
  }

  iRtn = read(iFd, &stBFHead, sizeof(BITMAPFILEHEADER));
  if(iRtn == 0)
  {
    printf("파일을 읽을 수 없습니다.\n");
    close(iFd);            
    return -1;
  }
  if0x4D42 != (stBFHead.bfType) )
  {
    printf("BMP파일이 아닙니다.\n");
    close(iFd);            
    return -1;
  }
  iRtn = lseek(iFd, sizeof(BITMAPFILEHEADER), SEEK_SET);
  if(iRtn != sizeof(BITMAPFILEHEADER) )
  {
    printf("읽어들일 부분이 잘못 지정되었습니다.\n");
    close(iFd);            
    return -1;
  }
  iRtn = read(iFd, &stBIHead, sizeof(BITMAPINFOHEADER));
  if(iRtn == 0)
  {
    printf("INFO헤더가 존재하지 않습니다.\n");
    close(iFd);            
    return -1;
  }

  ucpBuf = (void *)malloc(stBIHead.biSizeImage);
  if(0 == ucpBuf)
  {
    printf("사용 가능한 메모리가 부족합니다.\n");
    close(iFd);
    return -1;
  }
  lseek(iFd, sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), SEEK_SET);
  iRtn = read(iFd, ucpBuf, stBIHead.biSizeImage);
  

  if(iRtn == 0)
  {
    printf("데이터를 읽을 수 없습니다.\n");
    close(iFd);        
    free(ucpBuf);
    return -1;
  }
  for(uiCntY=0; uiCntY < stBIHead.biHeight; ++uiCntY)
  {
    for(uiCntX=0; uiCntX < stBIHead.biWidth; ++uiCntX)
    {
      ucpBuf[uiCntY * (stBIHead.biWidth * 3) + (uiCntX * 3) + 0= 0//blue  
      ucpBuf[uiCntY * (stBIHead.biWidth * 3) + (uiCntX * 3) + 1= 0//green
      ucpBuf[uiCntY * (stBIHead.biWidth * 3) + (uiCntX * 3) + 2= 0xFF; //red            
    }
  }
  lseek(iFd, 54, SEEK_SET);
  iRtn = write(iFd, ucpBuf, stBIHead.biSizeImage);
  if(iRtn == 0)
  {
    printf("데이터 쓰기에 실패 했습니다.\n");
    close(iFd);        
    free(ucpBuf);
    return -1;
  }

  lseek(iFd, 54, SEEK_SET);
  iRtn = read(iFd, cBuf, 16*16);  

  
  
  
  close(iFd);
  free(ucpBuf);
  
  return 0;

} 


라즈베리 파이는 558p 실습코드 입력 내용인데 조금 복잡해서 옆사람한테 물어보면서 하는게 좋을것 같습니다..

능력부족으로 정리불가..ㅠㅠ

728x90