TP N 5 Lecture et écriture de fichiers binaires

Documents pareils
Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Structure du format BMP, sa lecture, sa construction et son écriture

Projet Matlab : un logiciel de cryptage

TD : Codage des images

TP : Gestion d une image au format PGM

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Bases de programmation. Cours 5. Structurer les données

Programmation impérative

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Cours d initiation à la programmation en C++ Johann Cuenin

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Le langage C. Séance n 4

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

Formats d images. 1 Introduction

Conversion d un entier. Méthode par soustraction

Programmation C. Apprendre à développer des programmes simples dans le langage C

Représentation des Nombres

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Gestion de gros fichiers binaires (images) en APL*PLUS III

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Chap17 - CORRECTİON DES EXERCİCES

Rappels Entrées -Sorties

Ecran : Processeur : OS : Caméra : Communication : Mémoire : Connectique : Audio : Batterie : Autonomie : Dimensions : Poids : DAS :

Traitement bas-niveau

Codage d information. Codage d information : -Définition-

INFO 2 : Traitement des images

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Compression de Données - Algorithme de Huffman Document de Conception

Projet Matlab/Octave : segmentation d'un ballon de couleur dans une image couleur et insertion d'un logo

Programmation système I Les entrées/sorties

Licence Sciences et Technologies Examen janvier 2010

UE Programmation Impérative Licence 2ème Année

nom : Collège Ste Clotilde

Logiciel de Base. I. Représentation des nombres

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

Le codage informatique

Flux de données Lecture/Ecriture Fichiers


V- Manipulations de nombres en binaire

Les arbres binaires de recherche

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Chap III : Les tableaux

Cours d Algorithmique et de Langage C v 3.0

Plan du cours. Historique du langage Nouveautés de Java 7

Algorithmique et Programmation, IMA

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Comme chaque ligne de cache a 1024 bits. Le nombre de lignes de cache contenu dans chaque ensemble est:

OS Réseaux et Programmation Système - C5

Conventions d écriture et outils de mise au point

JPEG, PNG, PDF, CMJN, HTML, Préparez-vous à communiquer!

TP SIN Traitement d image

Traitement numérique de l'image. Raphaël Isdant

GESTION DES FICHIERS C/UNIX

Sur trois couches, on obtient donc 2563 = de couleurs, soit 24bpp (Bit Per Pixel).

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Introduction à MATLAB R

1.1 L EXPLORATEUR WINDOWS

UNE EXPERIENCE, EN COURS PREPARATOIRE, POUR FAIRE ORGANISER DE L INFORMATION EN TABLEAU

Analyse de sécurité de logiciels système par typage statique

Algorithmique, Structures de données et langage C

Cours 1 : Qu est-ce que la programmation?

Initiation. àl algorithmique et à la programmation. en C

Utiliser le logiciel Photofiltre Sommaire

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Cours de numérisation sur Epson Perfection

INTRODUCTION A L ELECTRONIQUE NUMERIQUE ECHANTILLONNAGE ET QUANTIFICATION I. ARCHITECTURE DE L ELECRONIQUE NUMERIQUE

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Informatique Générale

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Algorithme. Table des matières

Introduction au langage C

Représentation d un entier en base b

TP 1 : 1 Calculs en binaire, octal et hexadécimal

Programmation système en C/C++

TP 1. Prise en main du langage Python

ASR1 TD7 : Un microprocesseur RISC 16 bits

Structure fonctionnelle d un SGBD

Q6 : Comment calcule t-on l intensité sonore à partir du niveau d intensité?

FORMATS DE FICHIERS. Quels sont les différents types d informations numériques dans un document multimédia?

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Initiation à linfographie

Les structures de données. Rajae El Ouazzani

TP3 : Manipulation et implantation de systèmes de fichiers 1

Claude Delannoy. 3 e édition C++

STAGE IREM 0- Premiers pas en Python

Chapitre 1 : La gestion dynamique de la mémoire

TP1. Outils Java Eléments de correction

TP Codage numérique des caractères. Un ordinateur ne manipule que des 0 et des 1 : Comment alors code-t-il du texte?

Plus petit, plus grand, ranger et comparer

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Cours 1: Java et les objets

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Transcription:

TP N 5 Lecture et écriture de fichiers binaires ASR4 Programmation Système DUT Informatique Le but de ce tp est de manipuler les fichiers BMP. Vous trouverez au dos une description du format. Les manipulations à effectuer sont très simple. Réalisation Vous devez écrire une commande : modif_bmp [options] input output qui prend en entrée un fichier au format bmp et qui génère en sortie un fichier bmp aux mêmes caractéristiques (codage de l image, etc...) qui représente l image originale après divers traitements qui seront appliqués en fonction des options de la ligne de commande. Indications. Un découpage très simple vous est proposé, vous pouvez bien entendu utiliser toute autre méthode qui vous paraît plus judicieuse. Exercice 1 : Lecture de l entête Afin de retenir les informations stockées dans l entête, nous allons utiliser les structures suivantes qui correspondent à la description du format de fichier BMP. typedef unsigned short uint16; typedef unsigned int uint32; uint16 signature; uint32 taille_fichier; uint32 reserve; uint32 offset_donnees; } entete_fichier; uint32 taille_entete; uint32 largeur; uint32 hauteur; uint16 nombre_plans; uint16 profondeur; uint32 compression; uint32 taille_donnees_image; uint32 resolution_horizontale; uint32 resolution_verticale; uint32 taille_palette; /* en nombre de couleurs */ uint32 nombre_de_couleurs_importantes; /* 0 */ } entete_bitmap; entete_fichier fichier; entete_bitmap bitmap; } entete_bmp; Q 1. Compilez et exécutez le fichier ~hauspiem/public/asr4/struct_bmp.c. Qu observez vous? Quel problème pouvez vous identifier? À cause du problème repéré dans la question précédente, nous ne pouvons pas faire une simple lecture de l entête dans le fichier à l aide de read(desc,&bmp,sizeof(entete_bmp));. Nous allons devoir lire (ou écrire) les champs de la structure un à un.

Q 2. int lire_deux_octets(int fd, uint16 *val) qui lit deux octets dans le fichier dont le descripteur est donné en paramètre et retourne le nombre d octets effectivement lus, -1 en cas d erreur et 0 si le fichier est terminé. Q 3. int lire_quatre_octets(int fd, uint32 *val) qui lit quatre octets dans le fichier dont le descripteur est donné en paramètre et retourne le nombre d octets effectivement lus, -1 en cas d erreur et 0 si le fichier est terminé. Q 4. int lire_entete(int de, entete_bmp *entete); qui lit l entête du fichier en entrée et stocke les informations dans la structure passée en paramètre en se servant des fonctions précédentes. La fonction doit retourner -1 si l entête n a pas pu être lue correctement. La commande ~hauspiem/public/asr4/bmp vous permet d afficher les valeurs des champs contenus dans un fichier bmp afin de vérifier votre lecture. Exercice 2 : Écriture de l entête Q 1. int ecrire_deux_octets(int fd, uint16 val) qui écrit deux octets dans le fichier dont le descripteur est donné en paramètre et retourne le nombre d octets effectivement écrits ou -1 si une erreur est survenue. Q 2. int ecrire_quatre_octets(int fd, uint32 val) qui écrit quatre octets dans le fichier dont le descripteur est donné en paramètre et retourne le nombre d octets effectivement écrits ou -1 si une erreur est survenue. Q 3. int ecrire_entete(int vers, entete_bmp *entete); qui écrit l entete passée en paramètre dans le fichier de destination en se servant des fonctions précédentes. La fonction doit retourner -1 si l entête n a pas pu être lue correctement. Exercice 3 : Limitation de notre commande Pour ce TP, nous n allons lire que des fichiers BMP dont la profondeur d image est 24 bits, c est à dire dont chaque pixel est codé sur 3 octets, 1 octet par composante de couleur (bleu, vert, rouge). int verifier_entete(entete_bmp *entete); qui vérifie que le fichier bmp chargé précédemment est bien une image ayant une profondeur de 24 bits et retourne 1 si c est le cas et 0 sinon. Quand vous écrirez votre commande, si cette fonction retourne 0, la commande quittera en affichant un message d erreur. Exercice 4 : Allocation de l espace mémoire nécessaire à la lecture des pixels unsigned char* allouer_pixels(entete_bmp *entete); qui retourne un tableau suffisamment grand pour contenir tous les pixels de l image décrite par l entête passée en paramètre. Exercice 5 : Lecture des pixels int lire_pixels(int de, entete_bmp *entete, unsigned char *pixels); qui copie les pixels contenus dans le fichier de dans le tableau pixels qui aura été alloué au préalable. Le paramètre entete permet de savoir combien de données il faut lire dans le fichier.

Exercice 6 : Ecriture des pixels int ecrire_pixels(int vers, entete_bmp *entete, unsigned char *pixels); qui écrit les pixels contenus dans le tableau pixels dans le fichier vers. Le paramètre entete permet de savoir quelle est la taille du tableau pixels. Exercice 7 : Premier test, copie d un fichier bmp Pour tester toutes les fonctions précédentes, écrivez la fonction suivante : int copier_bmp(int de, int vers) entete_bmp entete; unsigned char *pixels; } /* lecture du fichier source */ lire_entete(de, &entete); pixels = allouer_pixels(&entete); lire_pixels(de, &entete, pixels); /* écriture du fichier destination */ ecrire_entete(vers, &entete); ecrire_pixels(vers, &entete, pixels); /* on libère les pixels */ free(pixels); return 1; /* on a réussi */ Cette fonction suppose bien évidemment que les fichiers source et destination ont été ouverts correctement (de et vers sont les descripteurs de ces fichiers). Récupérez le fichier hauspiem/public/asr4/test24.bmp et essayez d en créer une copie à l aide de votre programme. Exercice 8 : Modification de l image void rouge(entete_bmp *entete, unsigned char *pixels); qui ne conserve que la composante rouge de l image. N oubliez pas que l image est une succession de pixels et qu un pixel est constitué de trois octets, un pour le bleu, un pour le vert et un pour le rouge (dans cet ordre). Pensez également au problème de la taille des lignes (en octets) qui doit être un multiple de 4 void negatif(entete_bmp *entete, unsigned char *pixels); qui effectue le négatif de l image. Pour effectuer le négatif d une image, il suffit de remplacer chacun de ses pixels par leur complément à un void noir_et_blanc(entete_bmp *entete, unsigned char *pixels); qui passe les pixels de l image en noir et blanc void moitie(entete_bmp *entete, unsigned char *pixel, int sup); qui ne conserve que la moitié supérieure de l image si sup vaut 1 et la moitiée inférieure sinon. Attention, il faudra sûrement modifier l entete passée en paramètre cette fois.. Ici aucun test n est fait pour maintenir le sujet le plus clair possible pensez à TOU OURS effectuer tous les tests nécessaires de façon à ce que votre programme ne plante pas.... Pour rappel le complément à un est le nombre entier que l on obtient en remplacant les 0 par des 1 et les 1 par des 0 dans la représentation binaire. L opérateur permettant ceci en C est l opérateur. Pour passer les pixels d une image en noir et blanc il suffit d y réfléchir très fort au bout d un moment on trouve... :-

Exercice 9 : Le main et les options Écrire la fonction main de façon à ce que votre commande accepte les options suivantes : -r : ne conserve que la composante rouge -n : passe l image en négatif -b : passe l image en noir et blanc -s : récupère uniquement la moitié supérieure de l image -i : récupère la moitiée inférieure de l image Évidemment, les modifications seront appliquées à l image sauvegardée. Si plusieurs options sont passées, les traitements doivent être effectués dans l ordre (par exemple -n -b écrit une image passée en noir et blanc puis en négatif). Le script ~hauspiem/public/asr4/test_bmp.sh vous permet de tester votre programme.

Le format Entête du fichier L entête du fichier fournit des informations sur le type de fichier (Bitmap), sa taille et indique où commencent les informations concernant l image à proprement parler. L entête du fichier est codée sur 18 octets : 2 octects de signature indiquent la nature du fichier, nous considérerons que le fichier utilisé est correct ; 4 octets codant la taille totale du fichier ; 4 octets pour un champs réservé ; 4 octets pour l offset de l image. Entête de l image L entête de l image indique les caractéristiques de l image : 4 octets pour la taille de l entête de l image ; 4 octets pour la largeur de l image (en nombre de pixels) ; 4 octets pour la hauteur de l image (en nombre de pixels) ; 2 octets pour le nombre de plans (toujours 1) ; 2 octets pour la profondeur de codage de la couleur (i.e. 1, 4, 8, 16, 24 ou 32 bits par pixel) ; la méthode de compression (sur 4 octets). Cette valeur vaut 0 lorsque l image n est pas compressée, ou bien 1, 2 ou 3 suivant le type de compression utilisé; la taille totale de l image en octets (sur 4 octets) ; la résolution horizontale (sur 4 octets), c est-à-dire le nombre de pixels par mètre horizontalement ; la résolution verticale (sur 4 octets), c est-à-dire le nombre de pixels par mètre verticalement ; le nombre de couleurs de la palette (sur 4 octets). Si l image est palettisée et que ce nombre vaut 0 alors le nombre de couleurs est profon eur ; le nombre de couleurs importantes de la palette (sur 4 octets). Ce champ peut être égal à 0 lorsque chaque couleur a son importance. La palette de l image optionnelle sur 4 octets. odage de l image Le codage de l image se fait en écrivant successivement les bits correspondant à chaque pixel, ligne par ligne en commençant par le pixel en bas à gauche. Les images en 2 couleurs utilisent 1 bit par pixel, ce qui signifie qu un octet permet de coder 8 pixels. Les images en 16 couleurs utilisent 4 bits par pixel, ce qui signifie qu un octet permet de coder 2 pixels. Les images en 256 couleurs utilisent 8 bits par pixel, ce qui signifie qu un octet code chaque pixel. Les images en couleurs réelles utilisent 24 bits par pixel, ce qui signifie qu il faut 3 octets pour coder chaque pixel, en prenant soin de respecter l ordre de l alternance bleu, vert et rouge. Chaque ligne de l image doit comporter un nombre total d octets qui soit un multiple de 4 ; si ce n est pas le cas, la ligne doit être complétée par des 0 de telle manière à respecter ce critère.