Changer une couleur en C

Fermé
subgenk Messages postés 85 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 20 décembre 2012 - 14 nov. 2008 à 16:00
 ami_ccm - 14 nov. 2008 à 18:51
Bonjour,
je programme actuellement en C, pour modifier les pixels d'une image.

Le but est ici d'oublier les pixels autres que les pixels rouge.
(Bref rappel: sur les 3 pixels le 3e est le rouge, les 2 premiers, bleu et vert)

Mon code actuel est celui-ci:

void rouge(entete_bmp *entete, unsigned char *pixels)
{
int i;
for (i=0; i < entete->bitmap.taille_donnee_image; i++)
{
if(pixels[i+1]%3 == 0)
{
pixels[i]=0;
pixels[i-1]=0;
}
}
}

J'utilise les structures suivantes :
typedef struct
{
unsigned short signature;
unsigned int taille_fichier;
unsigned int reserve;
unsigned int offset_donnees;
} entete_fichier;

typedef struct
{
unsigned int taille_entete;
unsigned int largeur;
unsigned int hauteur;
unsigned short nombre_plans;
unsigned short profondeur;
unsigned int compression;
unsigned int taille_donnee_image;
int resolution_horizontale;
int resolution_verticale;
unsigned int taille_palette; /* en nombre de couleurs */
unsigned int nombre_de_couleurs_importantes; /* 0 */
} entete_bitmap;

typedef struct
{
entete_fichier fichier;
entete_bitmap bitmap;
} entete_bmp;


Le problème avec cette méthode ( void rouge(entete_bmp *entete, unsigned char *pixels); ) est le suivant :
Lors d'une image dont le nombre d'octets par ligne n'est pas un multiple de 4, la copie ne se fait pas correctement. Je cherche un moyen de completer ma ligne d'octet qui ne serait pas un multiple de 4 par des 0.

Merci d'avance
A voir également:

1 réponse

subgenk Messages postés 85 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 20 décembre 2012 5
14 nov. 2008 à 16:43
Pour les plus courageux: voici mon code entier (qui n'est au final pas très long :p):

Le fichier "modif_bmp.c" :
#include "modif_bmp.h"

unsigned int lire_4octets(int fd){
unsigned int buffer;
int rread;
rread=read(fd,&buffer,4);
if(rread==-1){
perror("Erreur de lecture");
return -1;
}
return buffer;
}

unsigned int lire_2octets(int fd){
unsigned short buffer;
int rread;
rread=read(fd,&buffer,2);
if(rread==-1){
perror("Erreur de lecture");
return -1;
}
return buffer;
}
int ecrire_2octets(int vers, unsigned short s){
int rwrite;
rwrite=write(vers, &s, 2);
if(rwrite==-1){
perror("Erreur d'ecriture");
return -1;
}
return s;
}

int ecrire_4octets(int vers, unsigned int i){
int rwrite;
rwrite=write(vers, &i, 4);
if(rwrite==-1){
perror("Erreur d'ecriture");
return -1;
}
return i;
}


int lire_entete(int de, entete_bmp *entete)
{
/** Lecture de l'entete du fichier*/
entete->fichier.signature = lire_2octets(de);
entete->fichier.taille_fichier = lire_4octets(de);
entete->fichier.reserve = lire_4octets(de);
entete->fichier.offset_donnees = lire_4octets(de);

/** Lecture de l'entete du bitmap*/
entete->bitmap.taille_entete = lire_4octets(de);
entete->bitmap.largeur = lire_4octets(de);
entete->bitmap.hauteur = lire_4octets(de);
entete->bitmap.nombre_plans = lire_2octets(de);
entete->bitmap.profondeur = lire_2octets(de);
entete->bitmap.compression = lire_4octets(de);
entete->bitmap.taille_donnee_image = lire_4octets(de);
entete->bitmap.resolution_horizontale = lire_4octets(de);
entete->bitmap.resolution_verticale = lire_4octets(de);
entete->bitmap.taille_palette = lire_4octets(de);
entete->bitmap.nombre_de_couleurs_importantes = lire_4octets(de);

return 1;
}

int ecrire_entete(int vers, entete_bmp *entete)
{
/** Ecriture de l'entete du fichier*/
ecrire_2octets(vers, entete->fichier.signature);
ecrire_4octets(vers, entete->fichier.taille_fichier);
ecrire_4octets(vers, entete->fichier.reserve);
ecrire_4octets(vers, entete->fichier.offset_donnees);

/** Ecriture de l'entete du bitmap */
ecrire_4octets(vers, entete->bitmap.taille_entete);
ecrire_4octets(vers, entete->bitmap.largeur);
ecrire_4octets(vers, entete->bitmap.hauteur);
ecrire_2octets(vers, entete->bitmap.nombre_plans);
ecrire_2octets(vers, entete->bitmap.profondeur);
ecrire_4octets(vers, entete->bitmap.compression);
ecrire_4octets(vers, entete->bitmap.taille_donnee_image);
ecrire_4octets(vers, entete->bitmap.resolution_horizontale);
ecrire_4octets(vers, entete->bitmap.resolution_verticale);
ecrire_4octets(vers, entete->bitmap.taille_palette);
ecrire_4octets(vers, entete->bitmap.nombre_de_couleurs_importantes);

return 1;
}

int verifier_entete(entete_bmp *entete)
{
if (entete->bitmap.profondeur == 24)
{
return 1;
}
return 0;
}

unsigned char* allouer_pixels( entete_bmp *entete)
{
unsigned char* c;
c = malloc(sizeof(char)*entete->bitmap.taille_donnee_image);
return c;
}

int lire_pixels(int de, entete_bmp *entete, unsigned char *pixels)
{
int rRead;
int rlseek;
rlseek = lseek(de, entete->fichier.offset_donnees, SEEK_SET);

rRead = read(de,pixels,entete->bitmap.taille_donnee_image);
if (rRead == -1)
{
perror("lecture pixels");
return -1;
}
if (rlseek == -1)
{
perror("Lseek");
return -1;
}
return rRead;
}


int ecrire_pixels(int vers, entete_bmp *entete, unsigned char *pixels)
{
int rWrite;
int rlseek;

rlseek = lseek(vers, entete->fichier.offset_donnees, SEEK_SET);

rWrite = write(vers,pixels,entete->bitmap.taille_donnee_image);
if (rWrite == -1)
{
perror("ecriture pixels");
return -1;
}
if (rlseek == -1)
{
perror("Lseek");
return -1;
}
return rWrite;
}

void rouge(entete_bmp *entete, unsigned char *pixels)
{
int i;
for (i=0; i < entete->bitmap.taille_donnee_image; i++)
{
if(pixels[i+1]%3 == 0)
{
pixels[i]=0;
pixels[i-1]=0;
}
}
}

void negatif(entete_bmp *entete, unsigned char *pixels)
{
int i;
for (i=0; i< entete->bitmap.taille_donnee_image; i++)
{
pixels[i]= ~pixels[i];
}
}

void noir_et_blanc(entete_bmp *entete, unsigned char *pixels)
{
int i;
int moyenne;
for (i=0; i< entete->bitmap.taille_donnee_image; i+=3)
{
moyenne = (pixels[i]+pixels[i+1]+pixels[i+2]);
moyenne = moyenne/3;
pixels[i] = moyenne;
pixels[i+1]= moyenne;
pixels[i+2] = moyenne;
}
}

void moitie(entete_bmp *entete, unsigned char *pixels, int sup)
{
int i;
int moitie = 0; /* moitie Sup */

if (sup)
{
/* moitie inf */
moitie = entete->bitmap.taille_donnee_image/2;
}

for(i=0 ; i<entete->bitmap.taille_donnee_image/2 ; i++)
{
pixels[i]= pixels[i+moitie];
}
entete->bitmap.hauteur = entete->bitmap.hauteur / 2;
entete->bitmap.taille_donnee_image = entete->bitmap.taille_donnee_image / 2;
}

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);

moitie(&entete,pixels,1);
/* Ecriture du fichier destination */
ecrire_entete(vers,&entete);
ecrire_pixels(vers,&entete,pixels);

/* On libère les pixels */
free(pixels);
return -1;
/* We did it ! */
}

int main (void)
{
int fd_de;
int fd_vers;

fd_de = open("chat.bmp", O_RDONLY);
fd_vers = open ("Copie_chat.bmp", O_CREAT|O_WRONLY,0777);

copier_bmp(fd_de,fd_vers);
return 0;
}







Le fichier modif.bmp.h :

#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

/** Declaration des structures */
typedef struct
{
unsigned short signature;
unsigned int taille_fichier;
unsigned int reserve;
unsigned int offset_donnees;
} entete_fichier;

typedef struct
{
unsigned int taille_entete;
unsigned int largeur;
unsigned int hauteur;
unsigned short nombre_plans;
unsigned short profondeur;
unsigned int compression;
unsigned int taille_donnee_image;
int resolution_horizontale;
int resolution_verticale;
unsigned int taille_palette; /* en nombre de couleurs */
unsigned int nombre_de_couleurs_importantes; /* 0 */
} entete_bitmap;

typedef struct
{
entete_fichier fichier;
entete_bitmap bitmap;
} entete_bmp;


/** Declaration des méthodes */

/** primitives */
unsigned int lire_4octets(int fd);
unsigned int lire_2octets(int fd);
int ecrire_2octets(int vers, unsigned short s);
int ecrire_4octets(int vers, unsigned int s);

/** methodes */
int lire_entete(int de, entete_bmp *entete);
int ecrire_entete(int vers, entete_bmp *entete);
int verifier_entete(entete_bmp *entete);
unsigned char* allouer_pixels( entete_bmp *entete);
int lire_pixels(int de, entete_bmp *entete, unsigned char *pixels);
int ecrire_pixels(int vers, entete_bmp *entete, unsigned char *pixels);
int copier_bmp(int de, int vers);
1
c trop court!!!!!!!!!!!
0