Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Wouter van Ooijen Mail: Sheets en verdere info: (en KSOOP2) Onderwerp: C programmeren voor gevorderden Literatuur:C handboek Kernighan & Ritchie Academic Service ISBN
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 2 Wat er van u verwacht wordt U bent (natuurlijk) aanwezig Neem de aangeven stof goed in u op U krijgt iedere week opgave(n); de opgave(n) van week N worden in principe op zijn laatst in week N+1 beoordeeld U maak de opgave(n) zelf Voor KSW002: tentamen Voor KSOOP2: gehaald als alle opgaven goed bevonden zijn
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 3 Materiaal Boek: C handboek, Kernighan & Ritchie USB memory stick (floppy mag ook, maar op eigen risico) Handouts DevC++ thuis installeren: Soms: hardware, ARM bord, etc
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 4 Wat gaan we doen? C gebruiken voor ‘practische’ dingen Binary I/O Werken met pre-defined file formats (bmp, wav, midi) PC paralelle poort als output Embedded (ARM en/of PIC) Vaste opgaven, eventueel afgesloten met vrije opgave
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 5 Binary I/O #include FILE *fp = fopen( name, ”rb” ); m = fread( &destination, sizeof(destination), n, fp ); m = fwrite( &source, sizeof(source), n, fp ); fclose( fp ); Je leest ‘letterlijk’ de bits uit de file naar je destination variabele. Geen formatting, geen interpretatie, gen conversie, niets.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 6 BMP -Erg simple ‘picture’ format -Windows specifiek -Onderdeel van een set van file formats -Alternatieven: gif, png, jpg, … -Bekijken, omzetten: bv IrfanView -Definitie? Geen idee, probeer google! lezen!
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 7 BMP format (1) - overall
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 8 BMP format (2) - header
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 9 BMP format (3) – info header
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 10 BMP format (4) - pallette
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 11 BMP format (5) – image data (pixels) 24 bits per pixel (= 3 bytes) Per regel, onderste regel eerst Binnen een regel left-to-right Aantal bytes per regel wordt ‘opgevuld’ met dummy (ongeruikte) bytes tot een veelvoud van 4
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 12 Opdracht 1 ’spelen’ Haal het bmp_dump programma op en maak er een executable van Installeer IrfanView Haal ergens een plaatje vandaan (bij voorkeur met veel contrast) Gebruik IrfanView om je plaatje om te zetten naar.bmp formaat Bekijk het plaatje met bmp_dump Gebruik IrfanView op het plaatje te re-sizen totdat je het behoorlijk kan zien met bmp_dump
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 13 bmp_dump.h - 1 typedef struct { unsigned short int type; unsigned int size; unsigned short int reserved1, reserved2; unsigned int offset; } __attribute__ ((packed)) t_bmp_header;
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 14 bmp_dump.h - 2 typedef struct { unsigned int size; int width,height; unsigned short int planes; unsigned short int bits; unsigned int compression; unsigned int imagesize; int xresolution,yresolution; unsigned int ncolours; unsigned int importantcolours; } __attribute__ ((packed)) t_bmp_info;
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 15 bmp_dump.c - 1 #include #include "bmp.h" int main(int argc, char *argv[]){ if( argc < 1 ){ printf( "please specify a file name\n" ); } else { read_bmp( argv[ 1 ] ); } system("PAUSE"); return 0; }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 16 bmp_dump.c - 2 void read_bmp( char *file_name ){ FILE *fd; int n, n_bytes, x, y, color; unsigned char *p; t_bmp_header header; t_bmp_info info; /* open file */ if( NULL == ( fd = fopen( file_name, "rb" ))){ printf( "could not open %s\n", file_name ); return; }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 17 bmp_dump.c - 3 /* read and check header */ if( 14 != sizeof( header )){ printf( "sizeof( header ) = %d\n", sizeof( header )); return; } if( 1 != ( n = fread( &header, sizeof( header ), 1, fd ))){ printf( "could not read header (n=%d)\n", n ); return; } if( header.type != 'MB' ){ printf( "type field is not 'BM' (=%d)\n", header.type ); return; } printf( "header file size = %d\n", header.size );
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 18 bmp_dump.c - 4 /* read and check info */ if( 40 != sizeof( info )){ printf( "sizeof( info ) = %d\n", sizeof( info )); return; } if( 1 != fread( &info, sizeof( info ), 1, fd )){ printf( "could not read info \n" ); return; } if( info.size != sizeof( info )){ printf( "info size =%d\n", info.size ); return; } printf( "format = %d x %d\n", info.width, info.height );
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 19 bmp_dump.c - 5 if( info.planes != 1 ){ printf( "info planes = %d\n", info.planes ); return; } if( info.bits != 24 ){ printf( "info bits = %d\n", info.bits ); return; } if( info.compression != 0 ){ printf( "info compression = %d\n", info.compression ); return; }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 20 bmp_dump.c - 6 /* read the pixel data */ n_bytes = multiple( ( info.bits / 8 ) * info.width, 4 ) * info.height; if(( n_bytes + sizeof( header ) + sizeof( info )) != header.size ){ printf( "file size does not match, n_bytes=%d\n", n_bytes ); return; } if( NULL == ( p = malloc( n_bytes ))){ printf( "out of memory allocating %d bytes\n", n_bytes ); return; } if( n_bytes != ( n = fread( p, 1, n_bytes, fd ))){ printf( "could not read %d pixel data bytes (%d read)\n", n_bytes, n ); return; }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 21 bmp_dump.c - 7 /* dump */ for( y = 0; y < info.height; y++ ){ for( x = 0; x < info.width; x++ ){ color = ( 3 * 255 ) - ( get( p, info, x, y, 0 ) + get( p, info, x, y, 1 ) + get( p, info, x, y, 2 )); if( color < 10 ){ printf( " " ); } else if( color < 250 ) { printf( "." ); } else if( color < 500 ) { printf( "o" ); } else { printf( "X" ); } printf( "\n" ); }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 22 bmp_dump.c - 8 int multiple( int n, int x ){ return x * (( n + ( x - 1 )) / x ); } int get( unsigned char p[], t_bmp_info info, int x, int y, int offset ){ y = info.height - ( y + 1 ); return p[ offset + ( 3 * x ) + ( multiple( 3 * info.width, 4 ) * y ) ]; } printf( "\n" ); }
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 23 Opdracht 2 ’sinus’ Maak een C programma dat een plaatje (bmp file) creeert met een behoorlijke formaat (bv 500 x 500 pixels). Het plaatje moet te bekijken zijn met IrfanView. Op het plaatje wil ik een cosinus zien (1 volle periode), compleet met X en Y as. Hints: gebruik zo veel mogelijk van de dmp_dump.c code; gebruik bmp_dump.exe om te controleren of je de file goed schrijft.