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
ami_ccm - 14 nov. 2008 à 18:51
A voir également:
- Changer une couleur en C
- Changer dns - Guide
- Changer clavier qwerty en azerty - Guide
- Excel cellule couleur si condition texte - Guide
- Changer la couleur de la barre des taches - Guide
- Changer couleur whatsapp - Accueil - Messagerie instantanée
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
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);
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);
14 nov. 2008 à 18:51