Bmp

cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 22 mai 2004 à 19:32
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 25 mai 2004 à 12:15
salut a ts

voila j'aimerai bien ouvrir un fichier bmp et remplacer les pixel noir a l'interieur par des violet . j'ai deja essayer des truc et je ni arrive pas . (j'arrive a lire les pixel mais pas a les changer )

merci d'avance
@+

12 réponses

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
23 mai 2004 à 10:41
Tu fais quoi pour les changes ?
Tu fais :
* tu charges ta bitmap avec LoadBitmap ou LoadImage
* GetDIBits
* tu changes les pixels
* tu fais SetDIBits
* tu la sauves dans le fichier
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
23 mai 2004 à 12:08
Ma source paint contient dans la classe BmpDoc toutes les fcts qui te sont nécessaire (ouverture bitmap, récupération bitmap, modification pixel, enregistrement bitmap).

http://www.cppfrance.com/code.aspx?ID=21052
0
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
23 mai 2004 à 21:33
voila j'ai trouver des truc mais sa marche pas pr les bitmap 24 bits . ( le prog doit copier le fichier bmp ) . sa marche seulement pr les 8 bits . je pense que c'est un truc avec la taille des pixel qui va pas , mais je sais pas precisement .

voila le code

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include

typedef struct
{
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
}HEADER;

typedef struct
{
BYTE bleu;
BYTE vert;
BYTE rouge;
}PIXEL;

HEADER en_tete(FILE* fd,HEADER header,char *nom_fichier)
{
fread(&header,sizeof(HEADER),1,fd);
if(header.file.bfType!=0x4D42)
{
printf("%s n'est pas un fichier bitmap\n",nom_fichier);
fclose(fd);
exit(-1);
}
return header;
}

void main ()
{

FILE *source,*nouveau;
source=fopen("teste.bmp","a+");
nouveau=fopen("new.bmp","w");

HEADER header;
header=en_tete(source,header,"teste.bmp");

fwrite(&header,sizeof(header)-2,1,nouveau);

PIXEL pixel;
pixel.bleu pixel.rouge pixel.vert = 0;

fseek(source,0x36,SEEK_SET);

for (int a=0; a<=128; a++)
{
for (int b=0; b<=128; b++)
{
fread(&pixel,sizeof(pixel),1,source);

PIXEL new_pixel;
if (pixel.vert>=0 && pixel.vert<=256) new_pixel.vert = pixel.vert;
if (pixel.bleu>=0 && pixel.bleu<=256) new_pixel.bleu = pixel.bleu;
if (pixel.rouge>=0 && pixel.rouge<=256) new_pixel.rouge = pixel.rouge;
/*
if (new_pixel.rouge==0 && new_pixel.bleu==0 && new_pixel.vert==0)
{new_pixel.rouge=255; new_pixel.bleu=255; }
*/
fwrite(&new_pixel,sizeof(new_pixel),1,nouveau);

cout << "sizeof(pixel) = " << sizeof(pixel) << endl;

}
}

}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
23 mai 2004 à 22:51
attention quand tu fait :
fread(&pixel,sizeof(pixel),1,source);
il se peut que tu lise plus de 3 octets, cela dépend de l'alignement des structures par le compilateur (en général multiple de 4). Il vaut mieux lire les composantes séparément.

les tests
if (pixel.vert>=0 && pixel.vert<=256)
sont inutiles car les composantes étant sur 1 octet (8 bits) les valeurs sont forcément entre 0 et 255.

Enfin, les pixels des bitmap sont stocké par ligne (en commencant par le bas sauf si la hauteur est < 0) avec une taille de ligne en octet qui doit être multiple de 4 (avec un padding si besoin).par ex un bmp de 63 pixels de large en 24 bits/ pixels aur des lignes de 63*24 1512 bits 189 octets aligné sur 192 octets (premier multiple de 4 supérieur).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
24 mai 2004 à 12:50
voila j'ai essayer de prendre les couleur une par une .
et sa ne marche pas plus que avant ( marche pr les 8bits ms pas pr les 24 bits )

voila le code :

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include

typedef struct
{
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
}HEADER;

HEADER en_tete(FILE* fd,HEADER header,char *nom_fichier)
{
fread(&header,sizeof(HEADER),1,fd);
if(header.file.bfType!=0x4D42)
{
printf("%s n'est pas un fichier bitmap\n",nom_fichier);
fclose(fd);
exit(-1);
}
return header;
}

void main ()
{

FILE *source,*nouveau;
source=fopen("teste.bmp","a+");
nouveau=fopen("new.bmp","w");

HEADER header;
header=en_tete(source,header,"teste.bmp");
fwrite(&header,sizeof(header,1,nouveau);

for (int a=0; a<128*128; a++)
{

char bleu=0,rouge=0,vert=0;

fread(&bleu,1,1,source);
fread(&rouge,1,1,source);
fread(&vert,1,1,source);

fwrite(&bleu,1,1,nouveau);
fwrite(&rouge,1,1,nouveau);
fwrite(&vert,1,1,nouveau);

}

}

si qq1 pourrai mexpliquer pr koa sa ne marche pas avec les bmp 24 bits .
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
24 mai 2004 à 13:33
toujours un problème d'alignement sur la structure HEADER.
BITMAPFILEHEADER fait 14 octets.
BITMAPINFOHEADER fait 40 octets.
EN regroupant ces 2 structures ensemble, le compile alignera 2ème structure sur 4 octets et la fait donc commencer à l'offset 16 (au lieu de 14). En lisant d'un coup HEADER, il y a un décalage de 2 octets.

il faut lire d'abord BITMAPFILEHEADER puis BITMAPINFOHEADER ou dire au compilo d'aligner HEADER sur 2 octets :
#include "pshpack2.h"
typedef struct
{
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
}HEADER;
#include "poppack.h"
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
24 mai 2004 à 13:36
toujours un problème d'alignement sur la structure HEADER.
BITMAPFILEHEADER fait 14 octets.
BITMAPINFOHEADER fait 40 octets.
EN regroupant ces 2 structures ensemble, le compile alignera 2ème structure sur 4 octets et la fait donc commencer à l'offset 16 (au lieu de 14). En lisant d'un coup HEADER, il y a un décalage de 2 octets.

il faut lire d'abord BITMAPFILEHEADER puis BITMAPINFOHEADER ou dire au compilo d'aligner HEADER sur 2 octets :
#include "pshpack2.h"
typedef struct
{
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
}HEADER;
#include "poppack.h"
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
24 mai 2004 à 13:38
toujours un problème d'alignement sur la structure HEADER.
BITMAPFILEHEADER fait 14 octets.
BITMAPINFOHEADER fait 40 octets.
EN regroupant ces 2 structures ensemble, le compile alignera 2ème structure sur 4 octets et la fait donc commencer à l'offset 16 (au lieu de 14). En lisant d'un coup HEADER, il y a un décalage de 2 octets.

il faut lire d'abord BITMAPFILEHEADER puis BITMAPINFOHEADER ou dire au compilo d'aligner HEADER sur 2 octets :
#include "pshpack2.h"
typedef struct
{
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
}HEADER;
#include "poppack.h"
0
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
24 mai 2004 à 18:10
voila j'ai reessayer qqchose en suivant tes indication et sa marche tjs pas
mais ia progres qd le bitmap ( 24bits ) est en 256 sa marche , mais qd il est en 16millions sa marche pas .

voila le code :

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include

BITMAPFILEHEADER file;
BITMAPINFOHEADER info;

void main ()
{

FILE *source,*nouveau;
source=fopen("teste.bmp","a+");
nouveau=fopen("new.bmp","w");

fread(&file,sizeof(file),1,source);
fread(&info,sizeof(info),1,source);

fwrite(&file,sizeof(file),1,nouveau);
fwrite(&info,sizeof(info),1,nouveau);

cout << sizeof(file)+sizeof(info) << endl;

for (int a=0; a<128*128; a++)
{

BYTE bleu=0,rouge=0,vert=0;

fread(&bleu,1,1,source);
fread(&rouge,1,1,source);
fread(&vert,1,1,source);

fwrite(&bleu,1,1,nouveau);
fwrite(&rouge,1,1,nouveau);
fwrite(&vert,1,1,nouveau);

}

fcloseall();

}
0
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
24 mai 2004 à 19:02
j'ai oublier de preciser , le bmp que j'obtient est net sur le 40 premiere ligne en partant du bas et est tt noir sur le haut de l'image .
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
24 mai 2004 à 22:43
Ca doit provenir de ton fichier de test car j'ai essayé et ca marche (avec un bitmap de 128*128 en 24bpp soit 16.7 millions de couleurs). Le fichier généré est identique au fichier initial.
0
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
25 mai 2004 à 12:15
c'est bizarre parce que j'ai 1 bmp avec lequel sa marche pas .
je sais pas trop de koa sa peut provenir . je peu te l'envoyer si tu veu et tu verra .
0
Rejoignez-nous