Communication Signal Design Lab.

한국어

연구실 소식

BMP파일을 만드는 법

2007.03.07 02:11

박기현 조회 수:6625 추천:263

// 일단 이 글 전체를 긁어붙입니다!
// 아래는 BMP 헤더작성을 위해(파일의 처음 부분의 세팅을 위해) 입력하는 부분입니다.

f = fopen("filename", "wb");
fprintf(f,"%c%c%c%c%c%c%c%c",0x42,0x4d,0x00,0x00,0x00,0x00,0x00,0x00);
fprintf(f,"%c%c%c%c%c%c%c%c",0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00);
fprintf(f,"%c%c%c%c%c%c",0x00,0x00,width%256,width/256,0x00,0x00);
fprintf(f,"%c%c%c%c",height%256,height/256,0x00,0x00);
fprintf(f,"%c%c%c%c%c%c%c%c",0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00);
//                  -------
fprintf(f,"%c%c%c%c%c%c%c%c",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
fprintf(f,"%c%c%c%c%c%c%c%c",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
fprintf(f,"%c%c%c%c",0x00,0x00,0x00,0x00);

// 위의 소스에서 f는 FILE*형 변수, width는 비트맵의 폭, height는 비트맵의 너비
// height 아래줄에 0x18이 있는데(밑줄 부분) 이 값을 0x01로 바꾸면 단색, 0x04로 바꾸면 16색,
// 0x08로 바꾸면 256색이 됩니다. 기본은 0x18 = 10진수 24로, 24비트 풀컬러입니다.
// 풀컬러 이외의 방식의 생성법은 다시 말씀드리겠습니다.

// 이후에는 색깔 정보를 넣어주어야 하는데, 다음과 같습니다.

for(i=height-1;i>=0;--i) { // 주의!
    for(j=0;j<width;++j) {
        fprintf(f,"%c",data_B[i][j]); // 블루 컬러 값, 0일경우 없음, 255일경우 퍼펙트 블루
        fprintf(f,"%c",data_G[i][j]); // 그린 컬러 값
        fprintf(f,"%c",data_R[i][j]); // 레드 컬러 값
    }

    if(width*3%4==1) // 한 열에 사용된 바이트 수는 4의 배수여야 한다.
        fprintf(f,"%c%c%c",0x00,0x00,0x00); // 다른 값을 넣어도 무방
    else if(width*3%4==2)
        fprintf(f,"%c%c",0x00,0x00);
    else if(width*3%4==3)
        fprintf(f,"%c",0x00);
}

fclose(f);

// 주의 사항: BMP는 맨 아래 줄부터 저장하게 됨. 즉 순서는 다음과 같다.
// 따라서 위와 같은 순서로 저장함
// ...
// 16 17 18 19 20
// 11 12 13 14 15
// 6  7  8  9  10
// 1  2  3  4  5



// 24b이외의 BMP파일 만드는 법

// f = fopen("filename", "wb");
// fprintf(f,"%c%c%c%c%c%c%c%c",0x42,0x4d,0x00,0x00,0x00,0x00,0x00,0x00);
// fprintf(f,"%c%c%c%c%c%c%c%c",0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00);
//                   -------
// 위의 0x36의 값에 4*색상 수를 더한다. 즉 단색이면 0x3e, 256색이면 0x36, 0x04가 된다.
// (이것은 파일에서 실제 그림 데이터가 입력되기 시작하는 지점을 의미한다.)
// 그리고 for루프를 돌리기 전에, 다음과 같은 설정을 해준다.
// fprintf(f,"%c%c%c%c", selectb, selectg, selectr, 0x00); // 0으로 쓰일 색
// fprintf(f,"%c%c%c%c", selectb, selectg, selectr, 0x00); // 1로 쓰일 색
// fprintf(f,"%c%c%c%c", selectb, selectg, selectr, 0x00); // ...
// fprintf(f,"%c%c%c%c", selectb, selectg, selectr, 0x00);
// ...(색상 수 만큼) ...
// (여기서 selectr 등은 쓰일 색의 RGB값이다. Blue Green Red 순으로 넣는다.
// 끝났다면, 다음과 같은 포맷으로 해 준다.
// 2색의 경우 한 바이트에 8픽셀이 저장됨. 16색의 경우 2픽셀이 저장됨
// 256색의 경우 1픽셀이 저장됨
// 저장 순서는 7f일 경우 맨 처음만 0으로 쓰인 색, 다음 7픽셀이 1로 쓰일 색으로 칠해짐
// 행 수를 맞추는 건 위와 같으며, 바이트의 도중에 행이 끝나면 임의의 수로 채움(0이 일반적)
// 데이터 형은 unsigned char가 일반적이다.
번호 제목 글쓴이 날짜 조회 수
공지 게시판 로그인시 주의점 admin 2016.02.17 11241
공지 2007년 지도교수 Dr. Golomb의 75회 생신기념 학회 참가기입니다. - 저 아래에서 퍼왔고 일부 수정했습니다.^^ 송홍엽 2014.01.20 51162
공지 국내외 학회 참가 후기 작성에 관한 조언 (모든 연구실 멤버는 국제학회 참가 후 여기 후기를 올리세요^^) 송홍엽 2008.07.24 33573
303 vtc2006spring 참가기 김준성 2006.05.23 3951
302 2006년 CITL 졸업생 세미나 2탄 진석용 2006.04.18 3961
301 겨울 MT 후기 정비웅 2004.02.06 3981
300 [old] 김정헌 2000/06/15 VTC2000 참가기 webmaster 2001.09.21 3987
299 [old] 김정헌 2000/01/31 겨울 MT webmaster 2001.09.21 3994
298 졸업생 김성하 결혼합니다~ 김성하 2010.04.15 3994
297 2004년 겨울MT후기 김영준 2004.02.06 4011
296 통신학회 추계학술대회 논문모집 송홍엽 2002.08.28 4017
295 변우성이 잘 지내는지 연락해보기 바란다. 송홍엽 2001.12.27 4018
294 (펀글) 백범 김구선생과 노무현 송홍엽 2002.12.21 4020
293 The First KICS IWIC 참가후기 김주영 2007.08.26 4020
292 [old] 송홍엽 2001/06/27 전문연구원 관련규정 (퍼온글) webmaster 2001.09.21 4023
291 2004학년도 석사과정 모집안내 송홍엽 2003.04.11 4024
290 여름엠티후기 김정현 2006.08.22 4038
289 학위논문 제출안내 송홍엽 2006.01.26 4043
288 [old] 신민호 2000/08/13 중국 학술대회 참가기 webmaster 2001.09.21 4074
287 VTC2007spring 참가기 file 김준성 2007.05.01 4081
286 IWSDA07 후기 file 김주영 2007.09.30 4088
285 통신학회 하계학술대회 후기... 문경하 2003.07.29 4095
284 [old] 정연식 2000/07/03 VTC 2000 참가기 webmaster 2001.09.21 4118