IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[c++.Net] Parcours des pixels d'une image


Sujet :

Framework .NET

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut [c++.Net] Parcours des pixels d'une image
    Bonjour,

    Voilà j'ai 2 images (png avec couche alpha), je calcule le rectangle d'intersection et je recupere pour chq image les pixels contenus dans ce rectangle...

    Mon prob je n'arrive pas à parcourir les pixels de cette portion d'image :

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	// on recupre les images des 2 objets
    	Bitmap^ image1 = ControleurAffichage::GetInstance()->recupererTexture(obj1->GetTexture());
    	Bitmap^ image2 = ControleurAffichage::GetInstance()->recupererTexture(obj2->GetTexture());
     
    	// on recupere les rectangles des 2 objets
    	Rectangle rect1 = Rectangle(obj1->GetPosition(), obj1->GetDimensions());
    	Rectangle rect2 = Rectangle(obj2->GetPosition(), obj2->GetDimensions());
     
    	// on recupere le rectangle de collision
    	Rectangle rectIntersect = rect1; 
    	rectIntersect.Intersect(rect2);
     
    	// on recupere les pixel de chq image compris dans ce rectangle de collision
        BitmapData^ pixelsImage1 = image1->LockBits(
    Rectangle(rectIntersect.X - obj1->GetPosition().X, rectIntersect.Y - obj1->GetPosition().Y, rectIntersect.Width, rectIntersect.Height), 
    ImageLockMode::ReadOnly, PixelFormat::Format32bppPArgb);
     
        BitmapData^ pixelsImage2 = image2->LockBits(
    Rectangle(rectIntersect.X - obj1->GetPosition().X, rectIntersect.Y - obj1->GetPosition().Y, rectIntersect.Width, rectIntersect.Height), 
    ImageLockMode::ReadOnly, PixelFormat::Format32bppPArgb);
     
    	// nombre de colonne
        int stride = pixelsImage1->Stride;
     
    	// on recupere un pointeur vers le debut des pixels
        IntPtr ptr1= pixelsImage1->Scan0;
        IntPtr ptr2= pixelsImage2->Scan0;
    voilà j'ai donc tout recupéré cependant comment parcourir mes ptr1 et ptr2 ?
    J'ai essayé avec un trinterpret_cast<Byte*> mais il me donne n'importe quoi (genre -140022..)

    EN fait j'aimerai faire une comparaison des pixels des 2 "mouceaux" d'images et voir si les pixels sont transparent ou pas...

    merci de votre aide

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    ben en fait ce qui me gene le plus c'est l'utilisation du "System.Runtime.InteropServices.Marshal.Copy" car j'ai lu que niveau performance c'etait pas le top(un peu comme getpixel) et quand je regarde du code c# il ne l'utilise pas alors je me disais qu'il y avait peut etre une autre methode ?
    Mais si j'essaye de refaire la methode c# cela ne marche pas...

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    bon j'ai quand meme essayé et ca ne marche pas (snif) en fait il me dit parametre invalide sur mon "Format32bppPArgb"...euh masi c'est quoi le format de mon image : je rappelle : format png avec couche alpha !!!


    d'ailleur c'est bizarre il ne me la fait pas tout le temps l'erreur

    voilà mon code au cas ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
     
    bool ControleurCollisions::TestPixelPerfect(Objet ^obj1, Objet ^obj2)
    {
    	// on recupre les images des 2 objets
    	Bitmap^ image1 = ControleurAffichage::GetInstance()->recupererTexture(obj1->GetTexture());
    	Bitmap^ image2 = ControleurAffichage::GetInstance()->recupererTexture(obj2->GetTexture());
     
    	// on recupere le rectangle des 2 objets
    	Rectangle rect1 = Rectangle(obj1->GetPosition(), obj1->GetDimensions());
    	Rectangle rect2 = Rectangle(obj2->GetPosition(), obj2->GetDimensions());
     
    	// on recupere le rectangle de collision
    	Rectangle rectIntersect = rect1; 
    	rectIntersect.Intersect(rect2);
     
    	// on recupere les pixel de chq image compris dans ce rectangle de collision
        BitmapData^ pixelsImage1 = image1->LockBits(Rectangle(rectIntersect.X - obj1->GetPosition().X, 
    														  rectIntersect.Y - obj1->GetPosition().Y, 
    														  rectIntersect.Width, rectIntersect.Height), 
    														  ImageLockMode::ReadOnly, PixelFormat::Format32bppArgb);
     
        BitmapData^ pixelsImage2 = image2->LockBits(Rectangle(rectIntersect.X - obj2->GetPosition().X, 
    														  rectIntersect.Y - obj2->GetPosition().Y, 
    														  rectIntersect.Width, rectIntersect.Height), 
    														  ImageLockMode::ReadOnly, PixelFormat::Format32bppArgb);
     
    	// nombre de colonne
        int stride = pixelsImage1->Stride;
     
    	// on recupere un pointeur vers le debut des pixels
        IntPtr ptr1 = pixelsImage1->Scan0;
        IntPtr ptr2 = pixelsImage2->Scan0;
     
        // nb pixels de l'image compris dans le rectangle  (rgba)
        int nbpixels = rectIntersect.Width * rectIntersect.Height * 4;
     
    	array<Byte>^ pixelsImg1 = gcnew array<Byte>(nbpixels);
    	array<Byte>^ pixelsImg2 = gcnew array<Byte>(nbpixels);
     
    	// copie les pixels qui sont dans le rectangle de collisions dans le tableau
    	System::Runtime::InteropServices::Marshal::Copy( ptr1, pixelsImg1, 0, nbpixels );
    	System::Runtime::InteropServices::Marshal::Copy( ptr2, pixelsImg2, 0, nbpixels );
     
        // compare la composante alpha des pixels (composante : transparence)
        for (int i = 3; i < pixelsImg1->Length; i+=4)
    	{
    		if (pixelsImg1[i] != 255 && 
    			pixelsImg2[i] != 255)
    		{
    			// on libere les pixels
    			image1->UnlockBits(pixelsImage1);
    			image2->UnlockBits(pixelsImage2);
    			return true;
    		}
     
    	}
     
    	// on libere les pixels
        image1->UnlockBits(pixelsImage1);
        image2->UnlockBits(pixelsImage2);
     
        return false;    
    }
    pour charger une texture c'est un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    texture = gcnew Bitmap("monimage.png");
    je comprends pas

  5. #5
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Question bête : j'imagine que tu as vérifié que ton imagé était bien chargée ?
    En l'affichant ou en la sauvegardant qq part ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/04/2007, 07h43
  2. Réponses: 1
    Dernier message: 08/03/2007, 15h39
  3. [FLASH 8] BitmapData -> changer des pixels d'une image en alpha
    Par Lorenzo77 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 15/12/2006, 17h13
  4. diffusion des pixels d'une image
    Par hagui dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 11/05/2006, 18h31
  5. [MFC]déplacement des pixels d'une image
    Par hagui dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2006, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo