본문 바로가기
정보과학

bmp 이미지 프로세싱

by chaechaekim 2019. 8. 31.
//1024*768, 24bit(2의 24승으로 색 표현), bmp file only
#include<stdio.h>
#define W 1024
#define H 768
#define head 54

FILE *fp1, *fp2; //파일 처리용 구조체 변수  
unsigned char R[H][W], G[H][W], B[H][W]; //색상 데이터 저장용

void bmp_open(char s[20], char t[20]) 
{
	fp1 = fopen(s, "rb"); //바이너리 읽기 모드로 파일 열기 2진법으로 읽음  
	fp2 = fopen(t, "wb"); //바이너리 쓰기 모드로 파일 열기 쓸 때도 2진 코드  
}
 
void bmp_close()
{
	fclose(fp1);
	fclose(fp2);
}

void head_copy()
{
	unsigned char t;
	for(int i=0;i<head;i++)
	{
		t = getc(fp1); //getc(): 1 byte를 입력받는 함수
		putc(t, fp2); //putc(): 1 byte를 출력하는 함수 
	}
}

void bmp_read()
{
	for(int i=0;i<H;i++) //열 단위  
		for(int j=0;j<W;j++) //행 단위 
		{
			B[i][j]=getc(fp1);
			G[i][j]=getc(fp1);
			R[i][j]=getc(fp1);
		}
}

void bmp_write()
{
	for(int i=0;i<H;i++)  
		for(int j=0;j<W;j++) 
		{
			B[i][j]=getc(fp1);
			G[i][j]=getc(fp1);
			R[i][j]=getc(fp1);
		}
}

void filter(float r, float g, float b)
{
	for(int i=0;i<H;i++)
		for(int j=0;j<W;j++)
		{
			B[i][j]=(int)(B[i][j]*b/100);
			G[i][j]=(int)(G[i][j]*g/100);
			R[i][j]=(int)(R[i][j]*r/100);
		}
		
	for(int i=0;i<H;i++)
		for(int j=0;j<W;j++)
		{
			putc(B[i][j], fp2);
			putc(G[i][j], fp2);
			putc(R[i][j], fp2);
		}
}

int main()
{
	bmp_open("rgb.bmp", "filter.bmp");
	head_copy();
	bmp_read();
	
	filter(50, 50, 50); //r,g,b percentage
	bmp_write();
	bmp_close();
}

filter(50, 50, 50);
filter(20, 50, 20);
filter(20, 20, 50);
filter(50, 20, 20);
filter(50, 20, 40);

'정보과학' 카테고리의 다른 글

n까지의 합  (0) 2019.09.02
recurse  (0) 2019.08.31
recur  (0) 2019.08.30
reverse  (0) 2019.08.30
피보나치 수열  (0) 2019.08.30

댓글