BMP 파일 처리

Similar documents
슬라이드 1

chap7.key

歯9장.PDF

디지털영상처리3

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

디지털영상처리3

슬라이드 1

11장 포인터

금오공대 컴퓨터공학전공 강의자료

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Æí¶÷4-¼Ö·ç¼Çc03ÖÁ¾š

untitled

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2


Microsoft Word - MSOffice_WPS_analysis.doc

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson13.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - 제11강 파일 처리

untitled

PowerPoint 프레젠테이션

2007_2_project4

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

Lab 3. 실습문제 (Single linked list)_해답.hwp

PowerPoint 프레젠테이션

C++-¿Ïº®Çؼ³10Àå

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

슬라이드 1

PowerPoint 프레젠테이션


Gray level 변환 및 Arithmetic 연산을 사용한 영상 개선

쉽게 풀어쓴 C 프로그래밍

제1장 Unix란 무엇인가?

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - [2009] 02.pptx

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

PowerPoint Template

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

untitled

Microsoft PowerPoint - chap4 [호환 모드]

untitled

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

PowerPoint 프레젠테이션

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-


Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

11장 포인터

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - Chapter_04.pptx

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

C Programming

23

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

슬라이드 1

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

금오공대 컴퓨터공학전공 강의자료

1.hwp

슬라이드 1

歯7장.PDF

chap7.PDF

K&R2 Reference Manual 번역본

5.스택(강의자료).key

ABC 11장

데이타전송

untitled

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - 10_C_Language_Text_Files

Microsoft Word - KPMC-400,401 SW 사용 설명서

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

KNK_C_05_Pointers_Arrays_structures_summary_v02

chap 5: Trees

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx

제12장 파일 입출력

본 강의에 들어가기 전

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

(SW3704) Gingerbread Source Build & Working Guide

PowerPoint 프레젠테이션

Transcription:

BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과

학습내용 영상반전프로그램제작 2

Inverting images out = 255 - in 3

/* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include <stdio.h> #include <windows.h> #define WIDTHBYTES(bytes) (((bytes)+3)/4*4) int main( int argc, char *argv[] ) { FILE *file; // file pointer BITMAPFILEHEADER hf; // 파일헤더 (bmp file header) BITMAPINFOHEADER hinfo; // 비트맵정보헤더 (bitmap information header) RGBQUAD rgb[256]; // Lookup Table int widthstep; // 라인당바이트 (bytes per a line) BYTE *lpimg; // 입력데이터포인터 (pointer for input image data) BYTE *lpoutimg; // 출력데이터포인터 (pointer for output image data) int x, y; if( argc < 3 ) { printf( "Insufficient Input Arguments \n" ); printf( " invertimage input_file ouput_file \n" ); return -1; 4

// 입력영상파일을연다 file = fopen( argv[1], "rb" ); if( file == NULL ) { printf( " 이미지파일을열수없습니다! \n" ); return -1; fread( &hf, sizeof(bitmapfileheader), 1, file ); // 파일헤더읽음 if( hf.bftype!= 0x4D42 ) { // BMP 포맷 ('BM') 인지를확인 printf( "BMP 파일이아닙니다. \n" ); return -1; fread( &hinfo, sizeof(bitmapinfoheader), 1, file ); // 비트맵정보헤더읽음 printf( "Size: (%3dx%3d) \n", hinfo.biwidth, hinfo.biheight ); // 크기정보출력 // 8bit gray-scale 영상을확인 if( hinfo.bibitcount!= 8 hinfo.biclrused!= 0 ) { printf( "8bit gray-scale 영상이아닙니다..!! \n" ); return -1; // Lookup Table 읽음 fread( rgb, sizeof(rgbquad), 256, file ); // Lookup Table 읽음 5

// 입력데이터를위한라인당바이트수계산 widthstep = WIDTHBYTES( (hinfo.bibitcount/8) * hinfo.biwidth ); fseek( file, hf.bfoffbits, SEEK_SET ); // 비트맵데이터가시작하는위치로이동 // 입력데이터를저장하기위한메모리할당 lpimg = (BYTE *)malloc( widthstep * hinfo.biheight ); // 입력영상에서영상데이터를읽음 fread( lpimg, sizeof(byte), widthstep*hinfo.biheight, file ); fclose( file ); // 결과데이터를저장하기위한메모리할당 lpoutimg = (BYTE *)malloc( widthstep * hinfo.biheight ); // 영상반전연산 for( y=0; y<hinfo.biheight; y++ ) { for( x=0; x<hinfo.biwidth; x++ ) { lpoutimg[y*widthstep + x] = 255 - lpimg[y*widthstep + x]; 6

file = fopen( argv[2], "wb" ); fwrite( &hf, sizeof(char), sizeof(bitmapfileheader), file ); fwrite( &hinfo, sizeof(char), sizeof(bitmapinfoheader), file ); fwrite( rgb, sizeof(rgbquad), 256, file ); fseek( file, hf.bfoffbits, SEEK_SET ); // 비트맵데이터가시작하는위치로이동 fwrite( lpoutimg, sizeof(byte), widthstep*hinfo.biheight, file ); fclose( file ); // 메모리해제 free( lpoutimg ); free( lpimg ); return 0; 7

파일 새로만들기 프로젝트 File New Project Project ImageNegative 8

콘솔응용프로그램 빈프로젝트 Console Application Empty Project 9

보기 솔루션탐색기 View Solution Explorer 1. Right-clicking on 소스파일Source Files 2. 추가 새항목 Add New Item main.cpp 10

11

True color images 에대해서도사용가능하도록 소스코드를변경하자! 12

13

/* 이프로그램은 8bit gray-scale 및 true color 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include <stdio.h> #include <windows.h> #define WIDTHBYTES(bytes) (((bytes)+3)/4*4) int main( int argc, char *argv[] ) { FILE *file; // file pointer BITMAPFILEHEADER hf; // 파일헤더 (bmp file header) BITMAPINFOHEADER hinfo; // 비트맵정보헤더 (bitmap information header) RGBQUAD rgb[256]; // Lookup Table int widthstep; // 라인당바이트 (bytes per a line) BYTE *lpimg; // 입력데이터포인터 (pointer for input image data) BYTE *lpoutimg; // 출력데이터포인터 (pointer for output image data) int x, y; if( argc < 3 ) { printf( "Insufficient Input Arguments \n" ); printf( " invertimage input_file ouput_file \n" ); return -1; 14

// 입력영상파일을연다 file = fopen( argv[1], "rb" ); if( file == NULL ) { printf( " 이미지파일을열수없습니다! \n" ); return -1; fread( &hf, sizeof(bitmapfileheader), 1, file ); // 파일헤더읽음 if( hf.bftype!= 0x4D42 ) { // BMP 포맷 ('BM') 인지를확인 printf( "BMP 파일이아닙니다. \n" ); return -1; fread( &hinfo, sizeof(bitmapinfoheader), 1, file ); // 비트맵정보헤더읽음 printf( "Size: (%3dx%3d) \n", hinfo.biwidth, hinfo.biheight ); // 크기정보출력 // 8bit gray-scale 및 true color 영상을확인 if( (hinfo.bibitcount!=8 hinfo.biclrused!=0) && hinfo.bibitcount!=24 ) { printf( "8bit gray-scale 영상이아닙니다..!! \n" ); return -1; // Lookup Table 읽음 if( hinfo.bibitcount == 8 ) { fread( rgb, sizeof(rgbquad), 256, file ); // Lookup Table 읽음 15

// 입력데이터를위한라인당바이트수계산 widthstep = WIDTHBYTES( (hinfo.bibitcount/8) * hinfo.biwidth ); fseek( file, hf.bfoffbits, SEEK_SET ); // 비트맵데이터가시작하는위치로이동 // 입력데이터를저장하기위한메모리할당 lpimg = (BYTE *)malloc( widthstep * hinfo.biheight ); // 입력영상에서영상데이터를읽음 fread( lpimg, sizeof(byte), widthstep*hinfo.biheight, file ); fclose( file ); // 결과데이터를저장하기위한메모리할당 lpoutimg = (BYTE *)malloc( widthstep * hinfo.biheight ); 16

// 영상반전연산 if( hinfo.bibitcount == 24 ) { for( y=0; y<hinfo.biheight; y++ ) { for( x=0; x<hinfo.biwidth; x++ ) { lpoutimg[y*widthstep+3*x+2] = 255-lpImg[y*widthStep+3*x+2]; /* R */ lpoutimg[y*widthstep+3*x+1] = 255-lpImg[y*widthStep+3*x+1]; /* G */ lpoutimg[y*widthstep+3*x+0] = 255-lpImg[y*widthStep+3*x+0]; /* B */ else if( hinfo.bibitcount == 8 ) { for( y=0; y<hinfo.biheight; y++ ) { for( x=0; x<hinfo.biwidth; x++ ) { lpoutimg[y*widthstep + x] = 255 - lpimg[y*widthstep + x]; 17

file = fopen( argv[2], "wb" ); fwrite( &hf, sizeof(char), sizeof(bitmapfileheader), file ); fwrite( &hinfo, sizeof(char), sizeof(bitmapinfoheader), file ); if( hinfo.bibitcount == 8 ) { fwrite( rgb, sizeof(rgbquad), 256, file ); fseek( file, hf.bfoffbits, SEEK_SET ); // 비트맵데이터가시작하는위치로이동 fwrite( lpoutimg, sizeof(byte), widthstep*hinfo.biheight, file ); fclose( file ); // 메모리해제 free( lpoutimg ); free( lpimg ); return 0; 18