Communication Signal Design Lab.

한국어

연구실 소식

BMP파일을 만드는 법

2007.03.07 02:11

박기현 조회 수:6280 추천: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 6523
공지 2007년 지도교수 Dr. Golomb의 75회 생신기념 학회 참가기입니다. - 저 아래에서 퍼왔고 일부 수정했습니다.^^ 송홍엽 2014.01.20 46276
공지 국내외 학회 참가 후기 작성에 관한 조언 (모든 연구실 멤버는 국제학회 참가 후 여기 후기를 올리세요^^) 송홍엽 2008.07.24 25491
303 vtc2006spring 참가기 김준성 2006.05.23 3733
302 겨울 MT 후기 정비웅 2004.02.06 3740
301 a full moon in your eyes... 송홍엽 2002.10.12 3744
300 [old] 김정헌 2000/01/31 겨울 MT webmaster 2001.09.21 3745
299 2007년 겨울엠티후기 박기현 2007.02.15 3760
298 2006년 CITL 졸업생 세미나 2탄 진석용 2006.04.18 3762
297 변우성이 잘 지내는지 연락해보기 바란다. 송홍엽 2001.12.27 3771
296 [old] 송홍엽 2001/06/27 전문연구원 관련규정 (퍼온글) webmaster 2001.09.21 3775
295 [old] 신민호 2000/08/13 중국 학술대회 참가기 webmaster 2001.09.21 3783
294 졸업생 김성하 결혼합니다~ 김성하 2010.04.15 3789
293 2004년 겨울MT후기 김영준 2004.02.06 3793
292 [old] 정연식 2000/07/03 VTC 2000 참가기 webmaster 2001.09.21 3803
291 2004학년도 석사과정 모집안내 송홍엽 2003.04.11 3829
290 (펀글) 백범 김구선생과 노무현 송홍엽 2002.12.21 3831
289 한번쯤 고민해볼만한 조금은 우스운 이야기입니다. 송홍엽 2014.01.20 3853
288 여름엠티후기 김정현 2006.08.22 3867
287 학위논문 제출안내 송홍엽 2006.01.26 3874
286 The First KICS IWIC 참가후기 김주영 2007.08.26 3882
285 통신학회 하계학술대회 후기... 문경하 2003.07.29 3894
284 VTC2007spring 참가기 file 김준성 2007.05.01 3896