Communication Signal Design Lab.

한국어

연구실 소식

BMP파일을 만드는 법

2007.03.07 02:11

박기현 조회 수:6465 추천: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 8776
공지 2007년 지도교수 Dr. Golomb의 75회 생신기념 학회 참가기입니다. - 저 아래에서 퍼왔고 일부 수정했습니다.^^ 송홍엽 2014.01.20 48954
공지 국내외 학회 참가 후기 작성에 관한 조언 (모든 연구실 멤버는 국제학회 참가 후 여기 후기를 올리세요^^) 송홍엽 2008.07.24 30563
343 2016 동계 통신 학술대회 참가 후기입니다. 김강산 2016.02.19 1446
342 한국통신학회 우수논문 수상자 Ericsson-LG 견학 프로그램 참가 후기 김정현 2016.06.30 1477
341 2011년 서울대 수학과 강연 송홍엽 2016.02.17 1849
340 2014년 여름 엠티 후기 김정현 2014.08.28 2898
339 14년도 하계 엠티 후기 박진수 2014.08.29 2942
338 14년 하계 엠티 후기 박다빈 2014.08.29 2965
337 JCCI 2014 후기입니다. 김정현 2014.04.29 3034
336 (유튜브) 라캄파넬라 - 피아노 연주 송홍엽 2014.01.20 3083
335 14년도 연구실 여름 엠티 후기 송민규 2014.08.29 3083
334 제주도 엠티 후기입니다 박기현 2014.08.29 3160
333 Professor Solomon W. Golomb receives National Medal of Science from US 송홍엽 2012.12.24 3190
332 2013년 5월 졸업생 모임 사진입니다. file 송홍엽 2014.01.20 3218
331 14' 하계 연구실 엠티 김인선 2014.08.29 3461
330 2002년 6월 16일 문장욱 결혼식 최기훈 2002.06.14 3475
329 2002 통신학회 하계 종합 학술발표회 참가기 김준성 2002.07.26 3478
328 연구실 PC에 관하여.. 최기훈 2002.03.23 3492
327 BK21 연구업적 지원표시의 예 송홍엽 2003.01.24 3496
326 겨울 MT를 다녀와서~ 김대선 2003.02.13 3513
325 겨울엠티 후기 최동현 2003.02.10 3565
324 2003년 겨울 MT 후기 김준성 2003.02.11 3569