728x90
반응형
비트맵
점 한 개에 1byte는 흑백을 의미하기 때문에 컬러로 나오는건 점하나당 byte가 틀리다.
160000이 400*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; } if( 0x4D42 != (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
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151109_13번_일일업무일지_박서연_영상처리(패딩, RGB컨트롤,히스토그램평활화) (10) | 2015.11.09 |
---|---|
평활화 소스 (2) | 2015.11.09 |
20151106 - 11번 남수진 / 라즈베리 파이(디바이스 드라이버를 이용한 GPIO제어), 영상처리(비트맵 이미지 편집) (8) | 2015.11.07 |
LED_DRIVER 소스 파일 (3) | 2015.11.06 |
디바이스 드라이브 예제 소스파일 (3) | 2015.11.05 |
20151104 2번 강동조[커널 빌드와 디바이스 드라이버] (5) | 2015.11.05 |
20151102-김재홍-라즈베리파이_C프로그래밍&ASM_Translation (6) | 2015.11.02 |
20151030 - 홍준모 오전 : UART 이용. 오후 : 사물 인터넷 (라즈베리파이), 어셈블리 (8) | 2015.10.30 |