Decoupage image bmp [Résolu]

cs_Subzero77 10 Messages postés mercredi 31 mai 2006Date d'inscription 30 avril 2007 Dernière intervention - 26 mars 2007 à 11:39 - Dernière réponse : RemiONERA 9 Messages postés mercredi 11 janvier 2006Date d'inscription 5 juin 2008 Dernière intervention
- 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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
RemiONERA 9 Messages postés mercredi 11 janvier 2006Date d'inscription 5 juin 2008 Dernière intervention - 26 mars 2007 à 14:31
3
Merci
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

Merci RemiONERA 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 85 internautes ce mois-ci

Commenter la réponse de RemiONERA
cs_Subzero77 10 Messages postés mercredi 31 mai 2006Date d'inscription 30 avril 2007 Dernière intervention - 26 mars 2007 à 16:08
0
Merci
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 !
Commenter la réponse de cs_Subzero77
RemiONERA 9 Messages postés mercredi 11 janvier 2006Date d'inscription 5 juin 2008 Dernière intervention - 27 mars 2007 à 07:38
0
Merci
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
Commenter la réponse de RemiONERA
cs_bossone 1 Messages postés mardi 25 mai 2004Date d'inscription 4 juin 2008 Dernière intervention - 4 juin 2008 à 17:57
0
Merci
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
Commenter la réponse de cs_bossone
RemiONERA 9 Messages postés mercredi 11 janvier 2006Date d'inscription 5 juin 2008 Dernière intervention - 5 juin 2008 à 09:39
0
Merci
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
Commenter la réponse de RemiONERA

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.