Communication Signal Design Lab.

한국어

연구실 소식

BMP파일을 만드는 법

2007.03.07 02:11

박기현 조회 수:6447 추천: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 8629
공지 2007년 지도교수 Dr. Golomb의 75회 생신기념 학회 참가기입니다. - 저 아래에서 퍼왔고 일부 수정했습니다.^^ 송홍엽 2014.01.20 48862
공지 국내외 학회 참가 후기 작성에 관한 조언 (모든 연구실 멤버는 국제학회 참가 후 여기 후기를 올리세요^^) 송홍엽 2008.07.24 30460
63 bb 송홍엽 2003.08.17 4037
62 APCC 2009 참가 후기 박기현 2009.10.14 4007
61 IWSDA07 후기 file 김주영 2007.09.30 3976
60 퍼온글 - 인터넷 접속 마비사태 송홍엽 2003.01.26 3968
59 VTC2007spring 참가기 file 김준성 2007.05.01 3964
58 통신학회 하계학술대회 후기... 문경하 2003.07.29 3957
57 The First KICS IWIC 참가후기 김주영 2007.08.26 3945
56 학위논문 제출안내 송홍엽 2006.01.26 3942
55 여름엠티후기 김정현 2006.08.22 3936
54 (펀글) 백범 김구선생과 노무현 송홍엽 2002.12.21 3926
53 2004학년도 석사과정 모집안내 송홍엽 2003.04.11 3904
52 [old] 정연식 2000/07/03 VTC 2000 참가기 webmaster 2001.09.21 3902
51 2004년 겨울MT후기 김영준 2004.02.06 3879
50 변우성이 잘 지내는지 연락해보기 바란다. 송홍엽 2001.12.27 3877
49 [old] 신민호 2000/08/13 중국 학술대회 참가기 webmaster 2001.09.21 3877
48 통신학회 추계학술대회 논문모집 송홍엽 2002.08.28 3866
47 졸업생 김성하 결혼합니다~ 김성하 2010.04.15 3864
46 [old] 송홍엽 2001/06/27 전문연구원 관련규정 (퍼온글) webmaster 2001.09.21 3851
45 2006년 CITL 졸업생 세미나 2탄 진석용 2006.04.18 3830
44 [old] 김정헌 2000/01/31 겨울 MT webmaster 2001.09.21 3829