Decoupage image bmp

Résolu
cs_Subzero77 Messages postés 10 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 30 avril 2007 - 26 mars 2007 à 11:39
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008 - 5 juin 2008 à 09:39
Bonjour a tous...


Je suis actuellement en 2eme année de BTS IRIS et mon projet de fin d'année est
le traitement d'image ( acquisition -> Niveaux de gris -> Bi-Color -> découpage)


Mon problème est le suivant :

Tout d'abord :

J'ai une image capturer à l'aide d'une webCam :

    - je stock le premier en-tête dans une Structure (
BITMAPFILEHEADER)

    - je stock le second en-tête dans une Structure (
BITMAPINFOHEADER)

    - je stock la zone de donnée (l'image) dans un tableau
d'octet (byte)


J'arrive à faire le traitement d'image (conversion gris et bicolore) mais je pèche
un peu sur le découpage : Celui doit se faire selon les coordonnées X et Y d'un
pixel et selon une largeur et une hauteur définit dans la fonction et ceci
n'importe où dans l'image !


Si quelqu'un savait me guider ou si quelqu'un a déjà travaillé la-dessus je
suis bon pour écouter toutes vos idées !

SVP MONDIPLOME EN DEPANT !!!!!!!


Merci d'avance, Saibot

5 réponses

RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
26 mars 2007 à 14:31
Salut

Ton problème me semble simple. A partir des coordonnées X et Y tu détermine l'adresse de départ de ta découpe puis tu copie les octets de ton image originale dans un tableau que tu auras défini au préalable.
Voici un petit exemple de code
<hr size="2" width="100%" />void Decoupe(int X, int Y,int L, int H, byte *pDecoupe)
 {
    int l,c,m;
     m=0;
      ptr=Y*LargeurBitmap+X;
     //puis tu fait la boucle suivante
     for(l=0;l<H;l++)
      {
        memcpy(&pDecoupe[m],Tablo[ptr],L);
        m+=L;
       ptr+=LargeurBitmap;
     }
}
<hr size="2" width="100%" />En espérant t'avoir aidé

Il y a des jours ou je maudis franchement micosoft
Cordialement Rémi
3
cs_Subzero77 Messages postés 10 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 30 avril 2007
26 mars 2007 à 16:08
Merci pour ta rep sa m'as bcp aidé !!
mais j'ai un peu fait autrement ! Pour ceux qui, comme moi, sont dans la merde :
--------------------------------------------------------------------------
void CExtraction::ExtraireZone(int xt, int yt, int largeur_fint, int hauteur_fint)
{
    int pos =0, pos2 = 0;
    int i = 0, j=0;
    int largeur_ini, hauteur_ini;

    //alocation mémoire pour le tableau
    nbrOctets = largeur_fint * hauteur_fint * 3;
    tabZone = new byte[nbrOctets];

    //recuper les infos de l'image
    largeur_ini = bmpinfoh.biWidth;
    hauteur_ini = bmpinfoh.biHeight;
   
    //definit les coordonnées
    pos = ((hauteur_ini - hauteur_fint - yt) * largeur_ini + xt) * 3;
   
    //Boucle pour Recopier l'image
    while(pos2<nbrOctets)    //tant que on a pas copier tout les octets
    {   
        for(i=0;i<largeur_fint*3;i=i+3) //Bcl parcour la ligne
        {
            tabZone[pos2+i]     = tabImage[pos+i];            //Copie des Données
            tabZone[pos2+i+1] = tabImage[pos+i+1];        //...
            tabZone[pos2+i+2] = tabImage[pos+i+2];        //...
        }
        pos = pos + largeur_ini * 3;        //On se positione sur la ligne suivante dans le tableau que l'on va copier
        pos2 = pos2 + largeur_fint * 3;        //On se positione sur la ligne suivante dans le tableau que l'on copie
    }

    //modification des en-tetes pour ecriture du nouveau bmp
    bmpfileh.bfSize = nbrOctets + (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
    bmpinfoh.biHeight = hauteur_fint;
    bmpinfoh.biWidth = largeur_fint;
    bmpinfoh.biSizeImage = nbrOctets;
}
------------------------------------------------------------------------------------------------------------
Voili Voilou Merci encore et A++ les gens !
0
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
27 mars 2007 à 07:38
Oui ton algo est équivalent. Toutefois je te suggère d'utiliser memcpy plutot que de faire les attributions dans une boucle c'est beaucoup plus rapide.

for(i=0;i<largeur_fint*3;i=i+3) //Bcl parcour la ligne
        {
            tabZone[pos2+i]     = tabImage[pos+i];            //Copie des Données
            tabZone[pos2+i+1] = tabImage[pos+i+1];        //...
            tabZone[pos2+i+2] = tabImage[pos+i+2];        //...
        }
peut être remplacé par

memcpy(&tabZone[pos2],&tabImage[pos],largeur_fint*3);

Il y a des jours ou je maudis franchement micosoft
Cordialement Rémi
0
cs_bossone Messages postés 1 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 4 juin 2008
4 juin 2008 à 17:57
Salut
Je suis une étudiante en première année d'école d'ingénieur. Nous devons programmer à l'aide du langage C++.
Notre problème se situe au niveau  du passage en niveau de gris d'une image bmp. Nous n'arrivons pas à ouvrir notre image en niveau de gris
merci pour votre aide
bises
0

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

Posez votre question
RemiONERA Messages postés 8 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 5 juin 2008
5 juin 2008 à 09:39
Salut

Tout d'abord connaissez vous le format d'un fichier Bitmap? Si ce n'est pas le cas il faut allez regarder chez microsoft (MSDN) ou encore dans l'aide du compilateur C que vous utilisez.

En gros une bitmap peut avoir plusieurs formats au niveau du codage des couleurs cela va de 1bit par couleur pour les images monochromes à 24 bit par couleur pour les images dites DIB (device independant bitmap) .

La première tache est de pouvoir charger n'importe quel type de bitmap.
Ensuite une bonne méthode pour la transformer en niveau de gris consiste à calculer la valeur moyenne des trois composantes couleur de chaque pixel.

Ensuite il n'y a plus qu'à sauver le bitmap ainsi transformé.

Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi
0
Rejoignez-nous