none
copie image buffer RRS feed

  • Question

  • voila pour le moment j'affiche une image moncrome, ensuite je teste chaque pixel et enfin je change mais c'est ... comment dire... très lourd.

    je voulais savoir si il existe une fonction qui le fait automatiquement, car toute celle que j'ai trouvais ne renvoi que un HANDLE mais pas de buffer.

    en sortie de la fonction je voudrais(si c'est possible) avoir une matrice du type :

    0,0,0,0,0,0,0,0,0,0,0,0,

    0,0,0,0,1,0,0,0,0,0,0,0,

    0,0,0,1,1,0,0,0,1,1,0,0,

    0,0,0,0,1,0,0,1,0,0,0,0,

    0,0,0,0,1,0,0,0,0,0,0,0,

    0,0,1,1,1,1,0,0,0,0,0,0,

    0,0,0,0,0,0,0,0,0,0,0,0,

    enfin vous voyez le genre, dessous le code que j utilise jusqu’à maintenant

    bitmapmono = LoadImage(NULL,"image2.bmp",IMAGE_BITMAP,0,0,LR_MONOCHROME|LR_LOADFROMFILE);
    
    dc = BeginPaint(hwndDlg, &ps);
    
    DrawState(dc,NULL,NULL,(long)bitmapmono,NULL,100,100,0,0,DST_BITMAP);
    
    int i,j;
    COLORREF color,color2,color3;
    color2 = RGB(0,255,0);
    color3 = RGB(255,0,255);
    for(i = 100; i<800;i++)
    {
      for(j = 100; j<700;j++)
      {
        color = GetPixel(dc,i,j);
        if((GetRValue(color)+GetGValue(color)+GetBValue(color)) > 380)
        {
          SetPixel(dc,i,j,color2 );
        }
        else SetPixel(dc,i,j,color3 );
      }
    }

    merci d'avance



    • Modifié 23253 jeudi 31 mai 2012 09:47
    jeudi 31 mai 2012 08:24

Réponses

  • Vous ne devriez pas manipuler les données qui sont directement en mémoire vidéo (GetPixel et SetPixel sur le DC écran).

    Chargez votre image dans un DC sous forme d'une Bitmap, faites les manipulations sur cette bitmap, puis affichez la bitmap transformée.

    Regardez ces tutoriels, surtout le 2ème :

    http://www.mvps.org/user32/gditutorial.html


    Paul Bacelar, Ex - MVP VC++

    jeudi 31 mai 2012 11:14
    Modérateur
  • Le tutoriel, c'est pour vous montrez comment utiliser les objets Bitmap, pas pour prendre tel quel.
    Vous avez affaire à des handles car toutes ces manipulations doivent pouvoir être virtualisées pour que les implémentations matérielles puissent prendre le relai.
    Je ne pense pas que votre calcul soit directement implémenté dans les opération de BitBlt ( http://msdn.microsoft.com/en-us/library/dd183370(v=vs.85).aspx )
     
    Si je devais faire cela avec le GDI, je pense que je ferais cela en créant ma bitmap dans un DC compatible écran où je pourrais directement manipulé les bitmaps, et ensuite je l'afficherais sur l'écran.
     
    Maintenant, je ne passerais pas par GDI pour cela, je chercherais à voir ce qui a remplacé DirectShow qui permettait de mettre des filtres vidéo. Cela devrait aussi ce faire facilement avec des Pixel Shader des DirectX récents.

    Paul Bacelar, Ex - MVP VC++

    jeudi 31 mai 2012 17:21
    Modérateur

Toutes les réponses

  • Vous ne devriez pas manipuler les données qui sont directement en mémoire vidéo (GetPixel et SetPixel sur le DC écran).

    Chargez votre image dans un DC sous forme d'une Bitmap, faites les manipulations sur cette bitmap, puis affichez la bitmap transformée.

    Regardez ces tutoriels, surtout le 2ème :

    http://www.mvps.org/user32/gditutorial.html


    Paul Bacelar, Ex - MVP VC++

    jeudi 31 mai 2012 11:14
    Modérateur
  • le problème avec ce tuto c'est que je ne peut pas manipuler de matrice , dans ce cas il fait un blitting le font en blanc le reste en noir, donc pour moi c'est pas bon, je veut pouvoit faire du calcul matriciel ...

    bon je vérifie quand même que j'ai pas loupé l’élément qu'il m'aurait fallut.

    jeudi 31 mai 2012 11:41
  • Le tutoriel, c'est pour vous montrez comment utiliser les objets Bitmap, pas pour prendre tel quel.
    Vous avez affaire à des handles car toutes ces manipulations doivent pouvoir être virtualisées pour que les implémentations matérielles puissent prendre le relai.
    Je ne pense pas que votre calcul soit directement implémenté dans les opération de BitBlt ( http://msdn.microsoft.com/en-us/library/dd183370(v=vs.85).aspx )
     
    Si je devais faire cela avec le GDI, je pense que je ferais cela en créant ma bitmap dans un DC compatible écran où je pourrais directement manipulé les bitmaps, et ensuite je l'afficherais sur l'écran.
     
    Maintenant, je ne passerais pas par GDI pour cela, je chercherais à voir ce qui a remplacé DirectShow qui permettait de mettre des filtres vidéo. Cela devrait aussi ce faire facilement avec des Pixel Shader des DirectX récents.

    Paul Bacelar, Ex - MVP VC++

    jeudi 31 mai 2012 17:21
    Modérateur
  • pour ceux qui cherche voila ce que j'ai trouvé sur le net et parfois un peut modifié :

    Et ATTENTION dans un bmp les couleurs ne sont pas enregistrées en RGB(rouge, vert, bleu) mais Bleu, Vert Rouge, et la lecture de l'image commence par le bas a gauche vers le haut a droite ... normal quoi comme façon de lire des données.

    bon code a ceux qui viendrons après moi.

    //structure d'un pixel Bleu Vert Rouge
    struct BVR
    {
       unsigned char blue;
       unsigned char green;
       unsigned char red;
    };
    
    struct BVR **pixel;
    
    //créé un tableau a deux dimention variables
    BVR **CreateTableBVR(int nbLin, int nbCol)
    {
    	BVR **tableau = (BVR **)malloc(sizeof(BVR*)*nbLin);
    	BVR *tableau2 = (BVR *)malloc(sizeof(BVR)*nbCol*nbLin);
    	for(int i = 0 ; i < nbLin ; i++){
    		tableau[i] = &tableau2[i*nbCol];
    	}
    	return tableau;
    }
    
    //libere un tableau a créer par CreateTableBVR
    void freeTableBVR(BVR **tableau)
    {
    	free(tableau[0]);
    	free(tableau);
    }
    
    //enregistre les composantes Bleu, Verte, Rouge dans un tableau "pixel"
    void lecteurdeBMPcouleur(char *bitmapfilename)
    {
        FILE *bitmapfile;
        bmpheader header;
        bmpinfo info;
        bitmapfile=fopen(bitmapfilename,"rb");
        if(bitmapfile==NULL){
            printf("Error when reading...!\n");
            exit(-1);
        }
    
        fread(&header,sizeof(bmpheader),1,bitmapfile);
    
        fread(&info,sizeof(bmpinfo),1,bitmapfile);
    
        pixel = CreateTableBVR(info.width,info.height);
    
        fseek(bitmapfile,header.offsetbits,SEEK_SET);
        unsigned char *value;
        value = (unsigned char*)malloc(Image.taille);
        fread(value,sizeof(unsigned char),Image.taille,bitmapfile);
    
        int comp = 0;
    
        for(int height=info.height-1;height>-1;height--){
            for(int width=0;width<info.width;width++){
                pixel[width][height].blue = value[comp];
                comp++;
                pixel[width][height].green = value[comp];
                comp++;
                pixel[width][height].red = value[comp];
                comp++;
            }
        }
        free(value);
        fclose(bitmapfile);
    }




    • Modifié 23253 lundi 11 juin 2012 12:29
    lundi 11 juin 2012 12:26
  • Ce code est très approximatif, car il ne décode pas l'en-tête du fichier bitmap.

    Il est donc fort probable qu'il ne fonctionne qu'avec assez peu de fichiers bmp.

    Toutes les bibliothèques graphiques sous Windows sont capables de lire un fichier bmp et dans faire un objet BitMap, rendant ce code inutile.

    Quel est le rapport avec la question de base, sur la manipulation d'un bitmap pixel par pixel ?


    Paul Bacelar, Ex - MVP VC++


    mardi 12 juin 2012 09:50
    Modérateur
  • avec ce code, j'arrive a lire tous les bmp que j'ai essayé de lire ce sont lut correctement, et pour la manipulation bit a bit ... ce code créer un tableau de pixel a deux dimensions variable (pour prendre toutes les tailles de bmp).

    un tableau c'est facilement manipulable a deux dimension encore plus.

    mardi 12 juin 2012 10:02
  • Tous les bmp que VOUS avez, en utilisant VOS outils de générations ont peut-être le format que vous indiquez.

    Vous donnez des information péremptoires et fausses sur le format des pixels d'une bitmap car vous n'avez même pas pris la peine de lire la documentation.

    Si vous l'aviez fait, je pense que l'utilisation des primitives GDI vous permettraient d'utiliser correctement et de manière transparente les différences de représentation entre les bitmaps.

    Si vous foulez faire des effets graphiques sans l'appui du matériel, prenez au moins en considération que les objets du GDI doivent être correctement initialisés pour que vous puissiez voir correctement vos "oeuvres".

    Lisez et assimilez la documentation GDI, SVP.


    Paul Bacelar, Ex - MVP VC++

    mardi 12 juin 2012 14:19
    Modérateur
  • ...

    j'ai encore beaucoup de truc a lire avant la fin de la semaine prochaine.

    mardi 12 juin 2012 15:32