LOADER BMP + TRAITEMENT

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 27 sept. 2006 à 20:05
dwarfo Messages postés 5 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 14 mars 2012 - 14 mars 2012 à 13:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33150-loader-bmp-traitement

dwarfo Messages postés 5 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 14 mars 2012
14 mars 2012 à 13:57
Oui non en fait j'ai supprimer crop, elle ne me servait pas... Oui j'ouvre et je sauvegarde la même image. Effectivement c'est un problème de dimension, lorsque je modifie l'image sous paint pour la mettre en 600*400 par exemple, la ça marche bien. J'ai bidouillé un peu et la je ne peux plus lire l'image sous "aperçu" mais je peux l'ouvrir sous paint ou on peut voir que c'est cette fois la bonne image mais qu'il y a un problème juste sur les toutes premières lignes qui sont noires avec quelques pixel de couleurs. Je sais pas si je suis très claire... Je vais continuer mon investigation ^^.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
14 mars 2012 à 13:47
Yop,
Peux-tu me préciser ton cas d'utilisation? Ouverture et sauvegarde de la même image? Pourquoi utilises-tu Crop()?
Ton image n'est pas carrée, ça peut être une piste de recherche...
dwarfo Messages postés 5 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 14 mars 2012
14 mars 2012 à 10:37
Salut Buno, Merci pour cette source qui est vraiment très utile !
J'ai en revanche un tout petit soucis. En effet lorsque je charge mon image 8 bits de taille 513x514 l'image "result" n'est pas la même que celle de départ comme si elle avait subit une rotation. J'ai rajouté la correction de nob17 :
"//Ajust Padding
m_Header.m_WidthUseLess=*Xsize%4;" dans la fonction crop, on se rapproche de l'image de départ mais c'est toujours pas ça... Je suis désolé de t'embêter mais aurais tu une idée d'ou cela peut provenir ??
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
2 févr. 2011 à 11:06
re,
Je repostes ta question:
"J'ai une image bitmap qui fait 24 bits par pixel (ImageX), j'aimerai la passer en 8 bits par pixel (ImageY), je suppose donc qu'il faut utiliser la fonction Save8bpp

source.Load("ImageX.bmp");
source.Save8bpp("ImageY.bmp");

est la ERROR !"

Réponse: Effectivement, tu ne peux pas utiliser directement la fonction Save8bpp() car il y a des traitements à faire avant: copie du header, de la palette...que tu peux trouver dans la fonction Save. Essaies donc de modifier la fonction Save suivant ton besoin, dans un 1er temps. De mon côté, j'essaie de modifier mon code pour permettre un enregistrement suivant un bpp demandé.
IamFliT Messages postés 1 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 2 février 2011
2 févr. 2011 à 08:24
Salut BUNO, je t'ai envoyé un mp.

peux-tu me répondre ?

merci.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
26 févr. 2010 à 09:42
Hello,
Ah oui, bien vu! Du coup, j'ai le même problème sur les images 4bits et 1bit.
Je mets à jour dès que je peux.
Thanks!
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
25 févr. 2010 à 14:15
Bonjour Buno,
J'ai constaté après différents tests (sur du bmp 8bits)que le crop ne fonctionnait pas pour les bmp destination dont le xSize n'était pas un multiple de 4. Je découpe des bandes de 100 pixels et cela n'avait donc pas d'incidence dans mon application, j'ai tout de même cherché, par curiosité et envie d'apprendre, une solution. Cela m'a conduit a mieux comprendre ton code (encore merci) en cherchant à corriger le problème au lieu de d'abuser à nouveau de ton temps.J'ai donc appris ce qu'était le padding, et réalisé que la correction de celui ci avait été omise dans la fonction crop, j'y ai donc rajouté ceci :

//Ajust Padding
m_Header.m_WidthUseLess=*Xsize%4;

(Après avoir tenté, en bon débutant :
int ent=*Xsize/4;
m_Header.m_WidthUseLess=(*Xsize/4)-ent;)

Bruo
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
25 févr. 2010 à 07:56
Cela me convient parfaitement Buno,
merci et merci encore...
Bruo ( c'est vrai, après tout, pourquoi s'encombrer de 'n'):P
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
24 févr. 2010 à 09:14
Dis-moi si cela te convient...
Merci de ta proposition, mais il paraît que "je ne manque pas d'air", d'où mon pseudo :P
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
23 févr. 2010 à 19:12
Merci Buno,
de mon coté, j'avais commencé à modifier la fonction Save, j'arrive a creer un nouveau bmp avec les pixels dont j'ai besoin, mais avec le header du bmp d'origine, j'étais donc en train d'essayer de coder une New_header lorsque tu a posté...
Comment te remercier...tiens je vois que tu t'appelle Buno et moi Bruno...Si tu veux, je te donne mon "r".
Merci encore de partager si volontier le fruit de ton labeur...
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
23 févr. 2010 à 16:58
Nob17, je viens d'implémenter la fonction Crop() pour ton besoin.
Je fais encore 2, 3 tests et je postes ma mise à jour
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
23 févr. 2010 à 15:04
Merci infiniment Buno !
J'arrive maintenant bien à compiler.
Je n'ai plus qu'à essayer de modifier cela pour obtenir un nouveau fichier contenant uniquement la bande extraite, et non une copie de celle ci sur l'image d'origine...
Une suggestion serait super bienvenue...si quelqu'un a un peu de temps à accorder au boulet que je suis (ce n'est pas mon habitude, mais là il faut bien le reconnaitre)
Merci encore Buno de m'avoir aidé.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
23 févr. 2010 à 14:20
Non, ça ne marche pas: la fonction prend des pointeurs en entrée, comme je l'ai déjà indiqué.
De plus, tu écrases l'image source en faisant ça, ce n'est pas ce que tu veux je pense.
Tu peux faire comme ceci:
source.Load("11.bmp");
int xSrc=568;
int ySrc=1782;
int xDest=100;
int yDest=1782;
int xSize=100;
int ySize=1782;
result = new CBmp(source);
result->Copy(source,&xSrc,&xSrc,&xDest,&yDest,&xSize,&ySize);
result->Save("11result.bmp");
delete result;
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
23 févr. 2010 à 12:06
Merci a nouveau de ta promptitude à répondre.

Est ce que ceci devrait marcher ?

CBmp source;

source.Load("11.bmp")
source.Copy(source,568,1782,100,1782,100,1782);
source.Save("11result.bmp");

ça bloque dés la compil.
merci
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
23 févr. 2010 à 11:53
Il faut faire une ouverture d'image au préalable.
Regardes l'exemple que je fourni dans le zip.
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
23 févr. 2010 à 11:49
Merci Buno pour ta réponse si rapide et détaillée.
mais...comme je te l'ai dis, je débute en C++, et c'est certainement tout bête mais je ne parviens pas à passer le nom de fichier à la variable.
désolé de poser une question aussi basique...
merci
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
22 févr. 2010 à 16:43
// Copie tout ou partie d'une bitmap source dans la courante
bool Copy(CBmp &Source,int *Xsrc,int *Ysrc,int *Xdest,int *Ydest,int *Xsize,int *Ysize);

Explication des paramètres:
- Source = image source dans laquelle tu veut puiser tes bandes
- Xsrc, Ysrc = coordonnées du point haut-gauche de ta bande dans l'image source (mis en pointeur car peut être modifier si tu fournis un point en dehors de l'image. Alors, je clippe à la taille de l'image)
- Xdest, Ydest = coordonnées du point haut-gauche de ta bande dans l'image destination (même remarque pour les pointeurs)
- Xsize = taille en X de la zone à copier
- Ysize = taille en Y de la zone à copier

Est-ce que cela répond à ta question?
nob17 Messages postés 7 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 25 février 2010
22 févr. 2010 à 16:14
Bonjour Buno,

comment utiliser la fonction copy ?
je dois couper en bandes un bmp,
je suis débutant en C++ et ne ne parviens pas à utiliser ta fonction, qui semble pouvoir répondre à mes besoins.
merci
rudaboy Messages postés 2 Date d'inscription mercredi 4 novembre 2009 Statut Membre Dernière intervention 7 décembre 2009
7 déc. 2009 à 16:12
Merci beaucoup pour ta réponse express!!
Chapeau bas pour ta réactivité....!!!
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 déc. 2009 à 15:18
Hello,
Tu peux utiliser la fonction EdgeDetection() qui prend en paramètre:
- le filtre à utiliser: Laplacien, Prewitt ou Sobel
- la valeur du seuil pour binariser l'image.

Par exemple:
CBmp source;
CBmp * result;

source.Load("bmp24.bmp");
result=source.EdgesDetection(LAPLACIAN,100);
result->Save("laplacien.bmp");
delete result;
printf("Laplacien fini\n");
rudaboy Messages postés 2 Date d'inscription mercredi 4 novembre 2009 Statut Membre Dernière intervention 7 décembre 2009
7 déc. 2009 à 15:04
Bonjour,
j'ai un petit problème, je n'arrive pas a utiliser la fonction de détection de contours, comment doit on l'utiliser?
Merci de me répondre
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
26 sept. 2008 à 11:08
Hum...je crois me rappeler qu'il y a effectivement une spécificité pour les BMP écrite par Photoshop.
Je vais donc me relancer dans le code.
Merci de l'info!
shintaa Messages postés 11 Date d'inscription dimanche 6 juillet 2008 Statut Membre Dernière intervention 9 octobre 2008
26 sept. 2008 à 10:10
Il y a un autre bug ds ton loader bmp. Lorsque tu récupère les données de l'image dans tes différents load, tu commences à l'adresse 0x36 + nbPaletteEntry*4. Mais le début des données ne correspond pas toujours à la fin de la palette. En fait il faut utiliser le champs offset pour se positionner pile devant les données. Ensuite dans le save soit il faut te positionner au meme offset pour écrire l'image, soit il faut modifier le champ offset (0x36 + nbPaletteEntry*4) pour écrire la donnée juste après la palette. L'offset est différent selon qu'on crée un bmp avec paint ou photoshop.
shintaa Messages postés 11 Date d'inscription dimanche 6 juillet 2008 Statut Membre Dernière intervention 9 octobre 2008
3 sept. 2008 à 21:04
Coucou,

Après une journée entière de débug il s'avère que l'image bmp1.bmp est bugué. En effet width * height / 8 est différent de ImageSize (il est plus grand). Ca pose un problème car l'image n'est pas complète. Avec une image créer à partir de paint ca marche. Si les explications ne sont pas claires préviens moi.

Voila il suffit donc juste de changer l'image :p
youp_youp_ Messages postés 8 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008
11 juil. 2008 à 11:04
Ok pas de soucis. "Par avance merci" (si t'oublies pas le post) :)
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
11 juil. 2008 à 11:01
Oups....
Oui, pardon, j'ai trouvé le problème. Je pensais juste faire 2 ou 3 modifs supplémentaires, en passant.
Je postes la mise à jour dans l'après-midi (si j'oublies pas :P)
youp_youp_ Messages postés 8 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008
11 juil. 2008 à 10:29
Tu avances dans ton investigation?
youp_youp_ Messages postés 8 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008
4 juil. 2008 à 14:29
Merci beaucoup pour ta réactivité (3h pour me répondre alors que le forum n'a pas changé depuis 2 mois, chapeau)
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 juil. 2008 à 14:19
Effectivement, bug reproduit. Mince!
Cela ne vient pas de la palette car en 32 bits, tu n'en as pas.
Le problème est plus général en fait: si tu ouvres une 32 bits et que tu la sauve dans la foulée, y'a un souci.
J'investigue et je te tiens au courant.
@+
Buno.
youp_youp_ Messages postés 8 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 18 novembre 2008
4 juil. 2008 à 11:00
Je crois bien que la transformation en niveau de gris ne marche pas avec ton programme (pour les 32bits). Je soupçonnerai bien une erreur au niveau de la palette.
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
25 mai 2008 à 16:25
plutôt libre à moi de me livrer à l'ajout de cette fonction
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
25 mai 2008 à 14:53
Bien sûr. Mais ma source ne l'implémente pas pour l'instant. Après, livre à toi de l'ajouter...
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
25 mai 2008 à 12:56
Mais l'histogramme peut être utiles pour appliquer des filtres.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
25 mai 2008 à 12:17
Non, mais le projet n'en a pas besoin. Pour en être sûr, tu peux supprimer le fichier misc.cpp (je pensais d'ailleurs l'avoir fait...).
Normalement, tu ne dois pas avoir de problème, ni à la compilation, ni à l'exécution.
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
25 mai 2008 à 12:13
en effet
codures Messages postés 2 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 12 septembre 2009
25 mai 2008 à 11:55
Salut,
Je viens 2 télécharcher le zip.
E bah "histogram.h" n'est tj pas la.
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
21 févr. 2008 à 14:32
Bonjour à tous,
Je viens de mettre à jour l'archive suite à la (bonne) remarque de Skone007.

Promis, j'essaie de trouver le temps d'y ajouter des fonctionnalités :P
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 févr. 2008 à 10:13
Tiens effectivement...tu as raison. Il a fallu 2 ans quand même avant que quelqu'un le remarque :)
Je m'étais promis de faire un upgrade un jour...je vais devoir me presser :P

NB: si tu en as besoin (envoie-moi un MP), je peux t'envoyer une version qui fonctionne.
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
6 févr. 2008 à 13:30
J'ai un problème quand on lit misc.cpp qui est l'instance d'un classe CHistogramme le fichier inclus Histogramme.h j'ai d'abord cru à une erreur et j'ai voulu mettre #include "misc.h" mais dans misc.h il n'y a aucune class CHistogramme...
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
27 sept. 2006 à 20:36
Ok, je vais penser à les améliorer et à rajouter quelques traitements.
Voire même, je pourrais faire une appli graphique!
Je vais essayer de trouver le temps...
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
27 sept. 2006 à 20:05
Salut
J'aime bien ta classe bitmap surtout les fonctions AND OR XOR sur les images. Pour faire de la morphologie, ces fonctions sont extrèmement intéressante...
Sinon tu pourrais amméliorer tes filtres. Sobel et prewitt sont des filtres monodirectionnels. Il faudrait pouvoir les appliquer dans les 8 directions de l'image. Cela amméliore grandement la detection des contours lorsque l'on additionne les 8 images.
Rejoignez-nous