티스토리 뷰

C언어

[C언어] 3-1. bmp파일을 raw파일로 변환하기

용감한 우디 2024. 11. 10. 18:37

안녕하세요!

오늘은 bmp파일을 raw파일로 바꾸는 방법에 대해 알아보겠습니다.

 

https://unrunhy.tistory.com/4

 

BMP파일 뜯어보기

안녕하세요!오늘은 BMP파일에 대해서 알아보겠습니다. ●BMP파일이란?비트맵(Bitmap) 이미지 파일 형식으로, 특히 windows 환경에서 많이 사용하는 이미지 형식입니다.BMP파일은 각 픽셀의 색상 정보

unrunhy.tistory.com

이 글을 먼저 읽고 오시는 것을 추천드립니다.

 

 

raw파일은 픽셀 데이터만 저장되는데, 

bmp파일은 픽셀 데이터 앞에 헤더부분이 있습니다!

 

bmp파일에 offset의 위치를 픽셀 데이터의 제일 앞 부분에 위치 시켜야합니다.

그래서 bmp파일의 헤더 부분을 저희가 만든 구조체에 저장한 후,

offset의 위치가 픽셀 데이터를 가리킬때, 

B G R -> R G B 를 고려해 메모리를 저장하도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

//제가 실습한 사진의 크기는 가로 256, 세로 256 입니다
#define VER 256
#define HOR 256
#define B_SIZE (VER*HOR)

struct BITMAPINFOHEADER {
    unsigned int biSize;
    unsigned int biWidth;
    unsigned int biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned int biCompression;
    unsigned int biSizeImage;
    int biXPelsPerMeter;
    int biYPelsPerMeter;
    unsigned int biClrUsed;
    unsigned int biClrImportant;
} bih;

struct BITMAPFILEHEADER {
    unsigned short bfType;
    unsigned int bfSIZE;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned int bfOffBits;
} bfh;

unsigned char* alloc_pic(int SIZE);

int main()
{
    int i, j;

    FILE* fin = fopen("Lena_Color.bmp", "rb");
    FILE* fout = fopen("Lena_Color.raw", "wb");

    if (!fin) { printf("ERROR :: File Can't Read\n"); exit(1); }
    if (!fout) { printf("ERROR :: File Can't Save\n"); exit(1); }

	// 헤더부분 먼저 읽어서 설정한 구조체에 저장하기
    // 그러면 bmp파일의 offset은 픽셀데이터의 첫부분에 위치함.
    fread(&bfh, sizeof(BITMAPFILEHEADER), 1, fin);
    fread(&bih, sizeof(BITMAPINFOHEADER), 1, fin);
	
    
    // 읽어들인 파일이 bmp파일인지 확인
    if (bfh.bfType != 0x4D42) { printf("Not a valid BMP file.\n"); printf("bfType: %x \n", bfh.bfType); exit(1); }
	
    
    //메모리 할당
    unsigned char* bmp1 = alloc_pic(bih.biSizeImage);
    unsigned char* raw1 = alloc_pic(B_SIZE * 3);
	
    //bmp1 메모리 공간에 픽셀데이터 저장하기
    fread(bmp1, sizeof(unsigned char), bih.biSizeImage, fin);

	// bmp파일의 B G R -> raw파일의 R G B 로 변환하여 저장하기
    for (i = 0; i < VER; i++) {
        for (j = 0; j < HOR; j++) {
            raw1[(VER * i + j) * 3] = bmp1[(VER * (VER - i - 1) + j) + 2];
            raw1[(VER * i + j) * 3 + 1] = bmp1[(VER * (VER - i - 1) + j) + 1];
            raw1[(VER * i + j) * 3 + 2] = bmp1[(VER * (VER - i - 1) + j)];
        }
    }

    fwrite(raw1, sizeof(unsigned char), B_SIZE * 3, fout);


    fclose(fin);
    fclose(fout);

    free(bmp1);
    free(raw1);


    printf("success");
    return 0;
}

/*** function ***/
unsigned char* alloc_pic(int SIZE)
{
    unsigned char* pic;

    if ((pic = (unsigned char*)calloc(SIZE, sizeof(unsigned char))) == NULL) {
        printf("\n malloc_picture : Picture structure \n");
        exit(1);
    }
    return pic;
}

 

이렇게 하시면,
bmp파일을 raw파일로 쉽게 바꿀 수 있습니다!

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함