본문 바로가기

Contact English

【코딩】 C 언어로 이미지 입출력하기

 

C 언어로 이미지 입출력하기

 

추천글 : 【C 언어】 C 언어 목차


Q. 데이터 표현과 응용 프로그램에 대한 다음 물음에 답하시오.

 

1. 그림판 프로그램을 이용하여 다양한 색상의 bmp 파일을 생성(단일, 4 bit, 8 bit, 24 bit)하고 이를 HEX 코드로 나타내시오.

 

 1 bit  

 4 bit  

 8 bit  

 24 bit

 

 

2. Exercise 

#include <stdio.h>
#include <stdlib.h>
#define width 100
#define height 100

unsigned char h[54];
unsigned char R[width][height], G[width][height], B[width][height];

int main(int argc, char *argv[]) {
	int i, j;
	FILE *in = fopen("image.bmp", "rb");	
	FILE *out = fopen("trans.bmp", "wb");
	// *in은 image.bmp를 가리키는 주기억 장치 내 포인터, FILE 변수이다.
	// rb는 read binary, wb는 write binary의 준말이다.
	
	if(in == NULL){	// "=" 만약 image가 없다면 
		printf("파일이 없습니다.");
		return 0;		
	}	
	
	for(i = 0; i < 54; i ++)	h[i] = getc(in);
	// h[i]가 in의 처음부터 54번째까지의 원소를 포함하도록 
	for(i = 0; i < width; i ++)
		for(j = 0; j < height; j ++){ // window에서 BGR 순으로 저장 
			B[i][j] = getc(in);
			G[i][j] = getc(in);
			R[i][j] = getc(in);
		}
	for(i = 0; i < width; i ++)
		for(j = 0; j < height; j ++){
			if(B[i][j] == 0 && G[i][j] == 0 && R[i][j] == 0){ // 픽셀이 검정이면
				B[i][j] = 255;
				G[i][j] = 255;
				R[i][j] = 255;			
			}
			else{
				B[i][j] = 0;
				G[i][j] = 0;
				R[i][j] = 0;
			}
		}

	for(i = 0; i < 54; i ++)	    fputc(h[i], out);
	for(i = 0; i < width; i ++)
		for(j = 0; j < height; j ++){
			fputc(B[i][j], out);	
			fputc(G[i][j], out);	
			fputc(R[i][j], out);	
			// 처리된 것들을 모두 보조디스크 내 trans 파일에 입력 			
		}
	fclose(in);
	fclose(out);
	return 0;
}

 

 

3. 이미지 기술의 이해

⑴ 파일 형식

① 비트맵 이미지 bmp는 비트들의 집합으로서 모든 정보를 그대로 저장함

png, gif, tif, jpeg 등은 손실 압축 기술을 써서 정보의 손실을 일으킴

gif는 색상 수를 8 bit 컬러로 무조건 줄이므로 큰 데이터 손실이 일어남

④ 손실 압축 기술은 색깔의 빈도, 패턴을 이용하기 때문에 그림에 따라 압축 효율이 달라짐

⑤ 이미지를 다시 읽어나갈 때 run length coding을 이용함 

⑵ 이미지의 단위

① 픽셀(= 화소)은 이미지의 가장 작은 단위

② 비트맵에서 픽셀의 깊이(색상 수)는 주로 24 bit

○ 트루 컬러 : 24 bit, 32 bit

○ 하이 컬러 : 16 bit

○ 256 컬러 : 8 bit

○ 24 bit에서는 R, G, B에 각각 8 bit를 할당함 (8 bit는 16진수 2자리)

○ 예 : 00 00 00은 검정색, FF 00 00은 빨간색 

③ 해상도 : 이미지 내 화소의 개수 

⑶ 이미지의 이원화 

① header : 파일 형식, 픽셀의 깊이, 해상도 정보를 담고 있음. 고정적

② body : 유동적 

 

 

3. 1에서 생성한 4종류의 파일의 용량을 직접 계산해 보고, 실제 크기와 비교하시오. 

⑴ header : 30,054 Byte (실제 결과) - 30000 Byte = 54 B

⑵ body : 24 bit/pixel (픽셀의 깊이) × 100 × 100 pixel (해상도) = 30000 Byte

⑶ 실제 디스크 할당 비트 : 32,768 Byte (이는 더 넓은 공간을 잡아 정보 소실을 막기 위함)

 

 

 

4.이미지 및 사운드의 표현 방식에 대해 비교하여 서술하여라.

 

이미지(Image) 사운드(Sound)
픽셀 샘플
해상도(1000만 ~ 2000만 화소)  샘플링 빈도(44.1 kHz, 자연스러움) 
색상수(픽셀의 깊이) 8, 16, 24, 32 bit  음색수 16, 32 bit 
bmp // jpg, png  wav // mp3, wma, ogg 
 이미지와 사운드는 굉장히 유사하다. (합칠 수도 있음, 동영상(프레임s)

 

입력: 2013.07.11 21:52

수정: 2023.06.16 11:53