Communication Signal Design Lab.

한국어

연구실 소식

BMP파일을 만드는 법

2007.03.07 02:11

박기현 조회 수:6202 추천: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 6247
공지 2007년 지도교수 Dr. Golomb의 75회 생신기념 학회 참가기입니다. - 저 아래에서 퍼왔고 일부 수정했습니다.^^ 송홍엽 2014.01.20 45842
공지 국내외 학회 참가 후기 작성에 관한 조언 (모든 연구실 멤버는 국제학회 참가 후 여기 후기를 올리세요^^) 송홍엽 2008.07.24 24728
303 방문자입니다 ... 조언좀 부탁드립니다. [2] 김태환 2002.08.25 6024
302 Re..방문자입니다 ... 조언좀 부탁드립니다. 송홍엽 2002.08.25 5835
301 Conference Link -- under Research [8] 송홍엽 2002.08.28 22977
300 A biography of C. E. Shannon [2] 송홍엽 2002.08.28 12436
299 통신학회 추계학술대회 논문모집 송홍엽 2002.08.28 3658
298 VTC 2003 Spring at Jeju 송홍엽 2002.09.04 4173
297 [펀글]2002 Fields Medal 수상자 발표 진석용 2002.09.09 3512
296 개인홈페이지의 사적인 게시판운용에 관하여 송홍엽 2002.09.14 4012
295 Re..채널코딩에 관한 질문입니다.. 진석용 2002.09.17 3968
294 2002-2 오류정정부호 수업게시판을 신설했습니다. 송홍엽 2002.09.26 4331
293 2002년도 제 3회 부호 및 정보이론 워크숍 [5] 최기훈 2002.10.07 5263
292 a full moon in your eyes... 송홍엽 2002.10.12 3727
291 and the earth....from space... [1] 송홍엽 2002.10.12 4529
290 EE-festival 연구실 소개 Poster 입니다. [2] 최기훈 2002.10.31 4903
289 석사과정 신입생 안동규/배슬기에게: 송홍엽 2002.11.21 3566
288 연구실 사진 [3] 윤현철 2002.11.21 5168
287 If you laugh at this, your english is quite good. 송홍엽 2002.11.22 4206
286 [펀글] 한국현대사 -- 노무현후보 홈페이지에서 송홍엽 2002.12.08 3480
285 Re..If you laugh at this, your english is quite good. [1] Nyang 2002.12.09 5542
284 2003학년도 1학기 담당교과목 [3] 송홍엽 2002.12.12 4995