C - bmp파일을 raw파일로 변환하기

Updated:

제가 C언어를 공부하면서 배웠던 문제를 공유하겠습니다.

이번 post는 bmp파일의 이미지를 읽은 후 raw파일로 변환해 저장하는 문제입니다.

입력의 lena파일은 256*256 size의 컬러 사진파일입니다.

파일 입,출력 포스팅에 있는 주석들은 생략하였습니다.

#pragma warning(disable:4996)
#include <stdio.h>
#include <windows.h>

#define T_SIZE 3*256*256                   

void BGRtoRGB(BYTE* BGR, BYTE* RGB, unsigned int Size);

void change(BYTE* Image);
void main()
{

	FILE* infile = fopen("Lena_Color.bmp", "rb");
	FILE* outfile = fopen("Lenna_small.raw", "wb");

	BITMAPFILEHEADER hf;
	fread(&hf, sizeof(BITMAPFILEHEADER), 1, infile);

	BITMAPINFOHEADER hInfo;
	fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, infile);

	BYTE* lpImg = (BYTE*)malloc(hInfo.biSizeImage * sizeof(unsigned char));
	BYTE* lpOutImg = (BYTE*)malloc(T_SIZE * sizeof(unsigned char));

	fread(lpImg, sizeof(unsigned char), hInfo.biSizeImage, infile);

	BGRtoRGB(lpImg, lpOutImg, T_SIZE);

	change(lpOutImg);

	fwrite(lpOutImg, sizeof(unsigned char), T_SIZE, outfile);

	fclose(infile);
	fclose(outfile);

}

void BGRtoRGB(BYTE* BGR, BYTE* RGB, unsigned int Size) // RGB로 변환 함수
{
	for (unsigned int i = 0; i < Size; i = i + 3)
	{
		RGB[i] = BGR[i + 2];
		RGB[i + 1] = BGR[i + 1];
		RGB[i + 2] = BGR[i];
	}
}

void change(BYTE* Image)    // 상하 반전 함수
{
	unsigned int i, j, ch;
	for (i = 0; i < 256 / 2; i++)

		for (j = 0; j < 768; j++)
		{
			ch = Image[i * 768 + j];
			Image[i * 768 + j] = Image[(256 - i - 1) * 768 + j];
			Image[(256 - i - 1) * 768 + j] = ch;

		}

}

Leave a comment