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
'▶ 자연과학 > ▷ C, C++' 카테고리의 다른 글
【코딩】 C 언어로 진법변환 (10진법 → 2진법) (0) | 2016.06.27 |
---|---|
【C 언어】 C 언어 목차 (0) | 2016.06.27 |
【코딩】 C 언어로 최단경로 알고리즘 (0) | 2013.12.13 |
【코딩】 C 언어로 CPS Festival 6번 문항 풀기 (0) | 2013.09.24 |
【코딩】 C 언어 또는 파이썬으로 행렬의 곱 구현하기 (0) | 2013.07.11 |
최근댓글