begin process at 2012 05 30 02:10:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Graphique

 > 

Probleme avec une fonction de rotation


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme avec une fonction de rotation

samedi 24 septembre 2005 à 15:52:17 | Probleme avec une fonction de rotation

SnOOpss

voila ma fonction

HBITMAP rotate90(HBITMAP hbmp)
{

BITMAP bm;
GetObject((HBITMAP)hbmp, sizeof(bm), &bm);

BITMAPINFO bi,biNew;
biNew.bmiHeader.biSize = bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
biNew.bmiHeader.biHeight = bi.bmiHeader.biWidth = bm.bmWidth;
biNew.bmiHeader.biWidth = bi.bmiHeader.biHeight = bm.bmHeight;
biNew.bmiHeader.biPlanes = bi.bmiHeader.biPlanes = bm.bmPlanes;
biNew.bmiHeader.biBitCount = bi.bmiHeader.biBitCount = 24;
biNew.bmiHeader.biCompression = bi.bmiHeader.biCompression = BI_RGB;

DWORD dwWidthBytes = 4*((3*bm.bmWidth+3)/4);
DWORD dwWidthBytesNew = 4*((3*bm.bmHeight+3)/4);

LPBYTE lpBits = new BYTE[dwWidthBytes*bm.bmHeight];
LPBYTE lpBitsNew = new BYTE[dwWidthBytesNew*bm.bmWidth];


HDC hdc = GetDC(NULL);
if (hdc == NULL) { return 0; }

GetDIBits(hdc, (HBITMAP)hbmp, 0, bm.bmHeight, lpBits, &bi, DIB_RGB_COLORS);
GetDIBits(hdc, (HBITMAP)hbmp, 0, bm.bmWidth, lpBitsNew, &biNew, DIB_RGB_COLORS);

int tmp;
int tmp2;

LPDWORD lpSrc,lpDst;

    for (int y = 0; y < bm.bmHeight; y++)
    {
        for (int x = 0; x < bm.bmWidth; x++)
        {
             tmp = (bm.bmHeight-y-1)*dwWidthBytes+3*x;
             tmp2 = (bm.bmWidth-x-1)*dwWidthBytesNew+3*y;

            lpSrc = (LPDWORD)&lpBits[tmp];
            lpDst =(LPDWORD)&lpBitsNew[tmp2];
            *lpDst = *lpSrc;

        }
    }

    HBITMAP hBmpDst=CreateDIBitmap(hdc,&biNew.bmiHeader,CBM_INIT,lpBitsNew,&biNew,DIB_RGB_COLORS);
    ReleaseDC(NULL, hdc);
    delete lpBits;
    delete lpBitsNew;

    return hBmpDst;

}

Elle marche nickel sur des resolution de 33*5 ou 33*22 mais ne marche plus sur 48*16 ou 49*16 j'ai une erreur du type "debug error" et si je clique sur ignorer mon prog continu avec un bug d'affichage.

Un moyen de la faire marcher est de faire LPBYTE lpBitsNew = new BYTE[dwWidthBytesNew*bm.bmWidth+4];  mais je me retrouve toujours avec le bug d'affichage.

J'ai essayé avec plusieurs resolutions (multiple de 16 de 32) et je n'arrive meme pas a trouver un point commun logique entre celle qui marchent et celles qui marchent pas !
Quelqu'un voit un truc anormal ?

samedi 24 septembre 2005 à 15:53:34 | Re : Probleme avec une fonction de rotation

SnOOpss

ha oui le probleme est sur delete lpBitsNew;
samedi 24 septembre 2005 à 17:24:32 | Re : Probleme avec une fonction de rotation

vecchio56

Administrateur CodeS-SourceS
Un tableau se détruit avec delete[], pas delete, qui ne supprimera que le premier element du tableau
J'ai l'impression que dans ta boucle, tmp2 peut devenir trop grand, tu devrais réserver
(bm.bmWidth-min(x)-1)*dwWidthBytesNew+3*max(y)
= (bm.bmWidth-1)*dwWidthBytesNew+3*(bm.bmHeight-1)
pour lpBitsNew
samedi 24 septembre 2005 à 18:01:32 | Re : Probleme avec une fonction de rotation

SnOOpss

J'ai corigé pour le delete mais par contre le probleme viens d'un decalage !!
Au debut j'ai bien cru ke tmp2 devenais trop gros(d'ailleur quand j augmente la taille du tableau il n'y plus de probleme) mais en tracant le max = 2301 pour un tableau de 2304.

En augmentant la taille du tableau il n'y a plus le bug mais le coté droit a une bande de pixel noir et le coté gauche une bande de la mauvaise couleur.


dimanche 25 septembre 2005 à 10:58:47 | Re : Probleme avec une fonction de rotation

SnOOpss

par contre ca marche en faisant
              lpBitsNew[tmp2] = lpBits[tmp];
            lpBitsNew[tmp2+1] = lpBits[tmp+1];
            lpBitsNew[tmp2+2] = lpBits[tmp+2];
a la place de
    //        lpSrc = (LPDWORD)&lpBits[tmp];
    //        lpDst =(LPDWORD)&lpBitsNew[tmp2];
    //        *lpDst = *lpSrc;

Ou me suis-je planté ???





Cette discussion est classée dans : bi, bmiheader, hdc, bm, binew


Répondre à ce message

Sujets en rapport avec ce message

Pixel vide [ par sabran ] Salut, Je veux lire la valeur RGB d'un pixel avec GetDIBits. J'ai pris un code que j'ai vu plusieurs fois sur le forum. Tout marche sauf quand je veux affichage de jpeg avec API windows ? [ par Batman60 ] salut à tousest-il possible d'ouvrir et d'afficher un fichier jpeg à l'aide des fonctions de windowspour l'instant j'utilise le code ci-dessous pour b freeimage [ par valerymb ] salut à tous. J'ai un petit problème à vous soumettre.voilà. J'ai une image non sauvegardée sur le disque que j'affiche en utilisant les mfc (hdc, hbi bitmap et png [ par lektrosonic ] Bonjour, je code une application w32 en C.J'ai une fenetre de demarage, (avec le logo etc..) qui est en format bitmap, charge a partir des resources, Récupération des pixels d'un DC [ par hilairenicolas ] Bonjour,Je dispose d'un DC où je voudrais récuperer le tableau de byte correspondant aux pixels qui le composent.Je me suis fortement inspiré de la so Manipulation de bitmap (SetDIBits) [ par _michel ] Encore une fois, j'ai un problème avec les bitmaps.J'ai bien cherché, en comparant avec un programme qui fonctionne, mais j'ai rien trouvé.Voila le co Fuite dans code (ci-joint) [ par Manson ] Salut a tous,voila j'ai fait ce bout de code pour redimensionner une bitmapau moment du WM_PAINT, ca marche bien, mais j'ai l'impressionque j'ai une f Une sorte de capture d'image... [ par tsc ] Bonjour,Voilà j'ai un petit problème avec une source qui permet de capturer l'image de sawebcam. source = http://www.cppfrance.com/code.aspx?ID=24541M Parser un DC/DIB [ par Manson ] Salut a tous,voila je voudrais recuperer une capture d'ecran (ca j'ai reussi).Ensuite je voudrais l'afficher sur le fond de ma fenetre, mais pas d'un Lire le buffer de pixels a partir d'un HBITMAP [ par Kazuya ] Bonjour,j'ai un probleme pour passer un Bitmap en 32bpp,je charge le fichier en memoire (HBITMAP) et ensuite je tente de le modifier, mais le probleme


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales