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

Visual C++ Discussion :

vc++ & matrice & image


Sujet :

Visual C++

  1. #61
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    La premi�re:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    RGBQUAD const *pcRgb = pcRgbBits + (yy*nWidth + xx) + temp[xx][yy];
    Si j'ai bien compris, tu cherches � ajouter la valeur comprise dans temp � celle que tu mets dans la matrice en sortie.
    L�, tu ajoutes au pointeur. Tr�s mauvais. Tu dois faire l'ajout dans le switch ou apr�s.
    Et la matrice P ne te sert � rien, puisque tu ne mets que des 1 dedans et que tu ne les lis m�me pas. Un simple temp[i][j] = 1*valeur suffirait (Et l� encore, la matrice temp ne sert pas � grand-chose...

    De plus, en regardant ton code global, je me suis rendu compte que ta fonction servait juste � ajouter une valeur � chaque membre d'une matrice. Le bitmap d'a rien � voir l�-dedans...

    -------------------------------------------------------------------------

    Pourquoi touches-tu au bitmap dans ta fonction qui calcule la DCT de ta matrice?
    La DCT n'est-telle pas suppos�e �tre calcul�e sur la matrice seule?

    -------------------------------------------------------------------------

    M�me remarque, tu n'as pas besoin du bitmap pour ta quantification, elle se fait sur la matrice seule.
    Le passage de matlab au C++ t'a-t-il abruti � ce point ?

    -------------------------------------------------------------------------

    Tu n'�cris rien du tout dans aucun bitmap, dans ta fonction d'�criture du bitmap destination...

    -------------------------------------------------------------------------

    Le code global a peut-�tre l'air �ventuellement correct. Mais vu tes performances dans les autres fonctions et ton �vidente incapacit� � comprendre � quoi sert mon code (puisqu'il n'�tait utile que dans la fonction de lecture et que tu l'as zombifiquement recopi� dans les autres), je ne saurais trop te recommander le traitement suivant:
    • Abandonner le projet,
    • r�apprendre le C++, les algorithmes et tout simplement � penser.



    PS: Tu ne commentes pas assez, non plus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #62
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    oui oui je sais mes grands erreurs
    pour moi , 'ai utili� la fonction ajout pour ajouter o bien retrancher une valeur � ts les coefficient de la matrice
    l� tu es raison , c initil d'utiliser le bitmap en entr�� , je dois utiliser une matruce [8][8].
    ********************************************************

    meme remarque pour la DCT, je dois utiliser une matrice [8][8]

    *******************************************************
    pour la fonction destination , ici j'ai rncontr� des pb
    cmt je r�cupere mon image grace � des matrces 8*8 deja calcul�es

    je vais reessaiyer de nouveau


    pour le pojet je ne peux pas abondonner, c impossible , je dois au moins resoler cette methode pour passr aux autres

  3. #63
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Au fait: Es-tu s�r qu'en sortie d'une DCT on ait toujours un bitmap?
    Pour moi, on a des donn�es pr�tes � �tre compress�es, mais rien d'affichable directement (refaire la fonction inverse de la DCT pour retransformer en bitmap).

    PS: J'ignore si la fonction inverse d'une DCT est ou non la DCT elle-m�me, mais �a n'a aucune influence sur le fait que le bitmap apr�s DCT ne soit plus un bitmap...

    PPS: SI j'ai bien compris, pour pas mal de tes fonctions, tu peux peut-�tre utiliser la m�me matrice en entr�e et en sortie (ta fonction modifierait donc la matrice existante).
    J'ignore si c'est possible pour la DCT, mais pour l'ajout d'une valeur � tous les membres, c'est ce qu'il y a de plus simple.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #64
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    voila une petite definition de ma methode:

    je copie la source :

    *************************************************
    calcul de la DCT par blocs de 8
    L'algorithme de calcul serait trop long si il fallait l'appliquer sur une matrice enti�re. Il faut donc d�composer l'image en bloc de 8*8 pixels. Il s'agit donc de r�cup�rer les trois matrices R, G et B et pour chacune d'elles d'extraire des matrices 8*8. On soustrait ensuite 128 � chaque valeur de la matrice. Ce nombre permet de diminuer le poids de la matrice, sans entra�ner de modifications puisqu'il suffira de rajouter ce nombre lors de la d�compression
    ***************************************************

    explication de la methode

    Cette methde prend en param�tre une matrice � trois dimensions (l'image BMP), elle d�coupe cette matrice en plusieurs matrice 8*8, sur chacune de ces matrices, elle retranche 128, r�alise la DCT et divise les nouvelles matrices par la matrice de quantification. Elle cr�e ainsi une nouvelle matrice trois dimension correspondant � l'image compress�e.

    **********************************************
    donc d'abord je prend le bitmap
    je la divise par bloc 8*8 ==>M88
    j'ajout � chaque coefficient de la marice une valeur ( donc en entr��� j'ai M88 et n sorie M88_128)
    j'aplique la DCT sur M888128 ==> M88DCT
    je devise cette matrice pa la matrice de quantification M88DCT/Q= M_Quantifi�e
    enfin je dois recupere mon bitmap ( bien sur le bitmap a �t� compress�) grace � des matrices de quantification

    voila mon algorithme

  5. #65
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Eh bien:
    1. Comme je l'ai d�j� dit, en sortie de l'algorithme, tu n'as plus un bitmap, mais des donn�es compress�es. Inutile donc de toucher � des fonctions de cr�ation de bitmap une fois qu'on a d�j� le bitmap initial.
    2. En sortie de la quantification, tu n'as pas des donn�es compress�es, mais une matrice "d�grad�e", pr�te � lire et � compresser.
      Une fois compress�es, ces donn�es pourront �tre sauvegard�es (si tu trouves une doc sur le format JPEG, tu pourrais m�me sauvegarder tes donn�es compress�es dans ce format).
    3. Les images et matrices ont deux dimensions, pas trois...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #66
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    en matlab, les image sont en fait des matrices 3 dimensions
    la troisieme d�signe la couleur
    et j'ai coipie la source qui explique l'algorithme en matlab

    http://intrage.insa-toulouse.fr/~dsp...ndex.htm#quant

    et pour tes remarque , ils sont parfaits, je ne dois pas toucher l'image bitmap dsonction ajout , dct, et quantification

    mais l� je suis perturb�e, comment je fais l'affectation
    pr�cedament qd j'utilise le bitmap :
    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
     
     
    	RGBQUAD const *pcRgbBits = static_cast< RGBQUAD const * >(pcBitmapBits);
     
    	//Parcours de la zone 8*8
    	for(int  xx=0 ; xx<8 ; xx++)
    	{
    		for( int yy=0 ; yy<8 ; yy++)
    		{
    			RGBQUAD const *pcRgb = pcRgbBits + (yy*nWidth + xx) ;
    			switch(eCouleur)
    			{
    			case ROUGE: pMatrice[xx][yy] = pcRgb->rgbRed;   break;
    			case VERT:  pMatrice[xx][yy] = pcRgb->rgbGreen; break;
    			case BLEU:  pMatrice[xx][yy] = pcRgb->rgbBlue;  break;
    			}
    		}
    	}
    mnt si j'utilise par exemple une matrice 8*8 en entr�� BYTE eMatrice[8][8]
    la fonction RGBQUAD ne permet pas de changer int to static_case

  7. #67
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    RGBQUAD est une structure, qui contient trois champs (+1 r�serv�).
    Dans un bitmap 32 bits, chaque pixel est une structure RGBQUAD.

    Ma fonction Get88Matrix32() sert � charger UNE couleur de 8*8 pixels dans une matrice 8*8.
    La couleur demand�e et sp�cifi�e dans le param�tre eCouleur.

    pcRgbBits est donc un pointeur vers un tableau de structures RGBQUAD.
    pcRgb est un pointeur vers la structure RGBQUAD du pixel courant.

    Ainsi, si je fais ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    x=0;
    y=0;
    Get88Matrix32(lpSrcBits, BmSrcInfo->biWidth, x, y, M88, ROUGE);
    M88 contiendra le rouge des pixels du premier carr� de 8*8 du bitmap.

    Et ensuite, tu pourras utiliser tes fonctions pour faire une DCT dessus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #68
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    merci pour tes explication por RGBQUAD

    j'�cries ce code, j'�spere qu'il soit correct:
    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
     
     
    BOOL AjoutMatrix32(
    // VOID const *pcBitmapBits, //[in] Données (pixels) du bitmap 32bits
     BYTE eMatrice[8][8],
     //int nWidth,               //[in] Largeur du bitmap 32bits en pixels
     
     int valeur,
     BYTE pMatrice[8][8],      //[out] Matrice 8*8 à lire
     enum e_couleur eCouleur   //[in] Couleur à lire
     )
    {
     
    	Byte	temp[8][8];
     
    		for (int i=0;i<8;i++)
    			{
    			 for (int j=0;j<8;j++)
    				{
     
     
    				temp[i][j]=1*valeur;
    				 }
    			}
     
    	for(int  xx=0 ; xx<8 ; xx++)
    	{
    		for( int yy=0 ; yy<8 ; yy++)
    		{
    			pMatrice[xx][yy]=eMatrice[xx][yy]  + temp[xx][yy];
    		}
    	}
    		return TRUE;
    }
    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
     
     
    BOOL DCTMatrix32(
    // VOID const *pcBitmapBits, //[in] Données (pixels) du bitmap 32bits
    // int nWidth,               //[in] Largeur du bitmap 32bits en pixels
     BYTE eMatrice[8][8],      //[int] Matrice 8*8 à lire
     BYTE pMatrice[8][8],      //[out] Matrice 8*8 à lire
     enum e_couleur eCouleur   //[in] Couleur à lire
     )
    {
     
    double c1,c2;
    double pi=3.14;
    for (int xx=0;xx<8;xx++)
    {
        for (int yy=0;yy<8;yy++)
    	{
            for (int i=0;i<8;i++)
    		{
                for (int j=0;j<8;j++)
    			{
                    //Test permettant de determiner la valeur des variables C1 et C2
    				pMatrice[0][0]=0;
                    if (xx==0)
                        c1=1/sqrt(2);
                    else
                        c1=1;
     
                    if( yy==0)
                        c2=1/sqrt(2);
                    else
                        c2=1;
    				//j'ai cette equation n matlab, je sais pas si j'ai bien convertit en vc++ et j'ai bien respecté les boules!!!
     
        pMatrice[xx][yy]=pMatrice[xx][yy]+1/sqrt(2*8)*c1*c2*eMatrice[xx][yy]*cos(pi*xx/8*(i/2))*cos(pi*yy/8*(j/2));               
     
    			}
     
     
    	}
    	}
    }
    	return TRUE;
    }
    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
    BOOL qantiMatrix32(
    // VOID const *pcBitmapBits, //[in] Donn�es (pixels) du bitmap 32bits
    // int nWidth,               //[in] Largeur du bitmap 32bits en pixels
     BYTE eMatrice[8][8], 
     int Fq,
     BYTE pMatrice[8][8],      //[out] Matrice 8*8 � lire
     enum e_couleur eCouleur   //[in] Couleur � lire
     )
    {
    	BYTE Q[8][8]; // calcul de la marice de quantification
    
     	for (int i=0;i<8;i++)
    			{
    			 for (int j=0;j<8;j++)
    			 {
    
    	     Q[i][j] = 1 + (( 1 + (i-1) + (j-1)) * Fq);
    
    		}
    	}
    //%quantification : division de la matrice ayant subi la DCT par
                	  //la matrice de quantification
    
    		for(int  xx=0 ; xx<8 ; xx++)
    			{
    			for( int yy=0 ; yy<8 ; yy++)
    				{
    				
    		for(int  i=0 ; i<8 ; i++)
    			{
    			for( int j=0 ; j<8 ; j++)
    				{
    
    				pMatrice[xx][yy]=eMatrice[xx][yy]  / Q[i+8*xx][j+8*yy];  // je sais si correcte ce que je fait, je veus que la matrice soit diviser par Q total pas par une coefficient				}
    					}
    			}
    		}
    
    		return TRUE;
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    pou la matrice destination j'ai pas encore resolu le pb
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    BOOL CImage::Compression(int qualite)
    {
     
    	if(!m_hDib)
    		return FALSE;	// DIB non valide
     
    	// On crée une nouvelle zone mémoire pour accueillir le nouveau bitmap
    	HGLOBAL hNewDib=GlobalAlloc(GHND, GlobalSize(m_hDib));
    	if(!hNewDib)
    		return FALSE;  // Pas assez de mémoire ou problème
     
    	LPBITMAPINFOHEADER BmSrcInfo=(LPBITMAPINFOHEADER)GlobalLock(m_hDib);
    	LPBITMAPINFO biSrc=(LPBITMAPINFO)BmSrcInfo;
     
    	LPBITMAPINFOHEADER BmDestInfo=(LPBITMAPINFOHEADER)GlobalLock(hNewDib);
    	LPBITMAPINFO biDest=(LPBITMAPINFO)BmDestInfo;
     
    	// Détermination du nombre de couleurs
    	int nColors = BmSrcInfo->biClrUsed ? BmSrcInfo->biClrUsed : 0x1FF & (1 << BmSrcInfo->biBitCount);
     
    	// Copie du Header + palette ds le nouveau bitmap
    	CopyMemory(biDest, biSrc, BmSrcInfo->biSize+nColors*sizeof(RGBQUAD));
     
    	// Détermination de la zone des bits de l'image source et largeur lignes en octets
    	BYTE* lpSrcBits = (BYTE*)BmSrcInfo+BmSrcInfo->biSize+nColors*sizeof(RGBQUAD);
    	int nScanWidth = WIDTHBYTES(BmSrcInfo->biWidth * BmSrcInfo->biBitCount);
     
    	// Détermination de la zone des bits de l'image destination
    	BYTE* lpDestBits = (BYTE*)BmDestInfo+BmDestInfo->biSize+nColors*sizeof(RGBQUAD);
    	//on suppose que les images ont des dimensions qui sont des multiples de 8       
    	//Je rappelle que width est la largeur et height est la hauteur
    	//nombre de matrice 8x8 dans la largeur de l'image
    	int 	nb_mat8_larg = BmSrcInfo->biWidth/8;
    	//nombre de matrice 8x8 dans la hauteur de l'image
    	int     nb_mat8_haut = BmSrcInfo->biHeight/8;
     
     
     
     
     if(BmSrcInfo->biBitCount==32) // 32 bits
    	{
     
     
     for (int x=0 ; x<nb_mat8_larg ; x++)
    	{
    	for (int y=0 ; y<nb_mat8_haut ; y++)
    		{
    		//  -/----------------\-
     
     
    		BYTE M88[8][8];
    		BYTE M88_128[8][8];
    		BYTE M88DCT[8][8];
    		BYTE M_quantifiee[8][8];
    		Get88Matrix32(lpSrcBits, BmSrcInfo->biWidth, x, y, M88, ROUGE);
    			AjoutMatrix32(M88, -128, M88_128, ROUGE);
    			DCTMatrix32(M88_128, M88DCT, ROUGE);
    	                         qantiMatrix32(M88DCT, qualite, M_quantifiee, ROUGE);
    	//	destiMatrix32(M_quantifiee, BmSrcInfo->biWidth, x, y, lpDestBits, ROUGE);
     
     
    	}
    		}
     
    }
     GlobalUnlock(m_hDib);
    	GlobalUnlock(hNewDib);
    	GlobalFree(m_hDib);
     
    	// On supprime l'ancien DIB et on le remplace par le nouveau
    	m_hDib = hNewDib;
    	return TRUE;
    }

  9. #69
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    La premi�re fonction a l'air pas mal, mais tu n'as pas besoin du param�tre eCouleur, et tu devrais modifier les commentaires.
    Personnellement, j'aurais utilis� la m�me matrice en entr�e et en sortie pour celle-l�, mais ce n'est pas un probl�me. Par contre, tu devrais rajouter const devant le param�tre de matrice en entr�e.
    PS: Le suffixe "32" est inutile ici: Je l'avais mis pour pr�ciser "bitmap 32 bits", mais l� on ne parle plus du bitmap.

    ---------------------------------------------------------------------------

    je ne connais pas assez la DCT, mais m�me remarque sur les commentaires, les param�tres et le nom de la fonction.

    ---------------------------------------------------------------------------

    Je n'ai pas compris ton commentaire en rouge: Tu veux faire une division membre � membre ou une division matricielle?
    Si je me souviens bien de la m�thode de compression, il te faut une simple division membre � membre. Tu devrais faire une fonction de division expr�s pour cela (deux matrices en entr�e, une en sortie) et l'appeler depuis qantiMatrix32()...

    ---------------------------------------------------------------------------

    Pour la fonction g�n�rale, tu as toujours deux bitmaps, ce qui n'est pas normal. Je n'ai pas regard� plus loin.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #70
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    oui oui efctivement, j'ai pas besoin de ecouleur ds les fonctions ajout, dct, quanti

    pour les commentraires bien sur je dois les modifier, mais moi je fais juste une copier coller des programmes sans tien compte de les changer mnt


    pour la quantification je veux division membre � membre donc je dois modifier le programme:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	for(int  xx=0 ; xx<8 ; xx++)
    			{
    			for( int yy=0 ; yy<8 ; yy++)
    				{
     
     
    				pMatrice[xx][yy]=eMatrice[xx][yy]  / Q[xx][yy];  
    				}
    					}
    pour la foncton destination je sais pas cmt je l'crire
    une matrice 8*8 n entr�e ( M_Qauntification)
    et en sortie lpDestBits


    moi je pense que la sortie de l'algorithme une bitmap compresse
    si je l'affiche je la trouv comme l'originale mais flou de mauvaise qualit� (compress�e)
    et ici on voit le role du facteur de quakit� que je le fait appeler en la fonction Compresion ;
    je pense �c!!!!!!!!

  11. #71
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    pour les commentraires bien sur je dois les modifier, mais moi je fais juste une copier coller des programmes sans tien compte de les changer mnt
    C'est pourtant urgent. Si tu ne le fais pas maintenant, tu risques d'y penser trop tard.

    La division membre � membre a l'air OK, par contre.

    Mais n'oublie pas qu'en sortie de la quantification, les donn�es ne sont pas encore compress�es: Elles sont seulement d�grad�es pour �tre plus faciles � compress�es.

    Pour la sortie, il faut lire le contenu de la matrice (de pr�f�rence en diagonale) vers un tableau de 64 octets. Ainsi, ce tableau sera termin� par une suite d'octets � z�ro (r�sultat de la quantification). Alors, tu devras appliquer un algorithme de compression dessus (huffman, RLE, etc.). Tu peux aussi �crire toutes les sorties � la suite dans un grand buffer (ou dans un grand fichier) et tout compresser � la fin. Normalement, le fichier ainsi compress� sera plus petit que si on avait compress� le bitmap sans rien lui faire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #72
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    franchement j'ai pas bien compris ts

    j vais essaiyer de stocker lamatrice de quantification ds un tableau

    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
     
    BOOL lirequant(
     
     BYTE const eMatrice[8][8],     ////[in] Matrice 8*8 à lire  M_Quantifiée
     
     double tab64[64]               //[out] tableau 64 à lire  
     
     )
    {
     
    		for(int  xx=0 ; xx<8 ; xx++)
    		{
    			for( int yy=0 ; yy<8 ; yy++)
    			{
    				for(int  ww=0 ; ww<8*8 ; ww++)
    					{
     
    			tab64[ww]=eMatrice[xx][yy];
    			}
     
    		}
     
    	}
     
    	return TRUE;
    }

    mas pour l'algorithme d compression hufman ou RLE je sais pas cmt faire
    j'ai trouv� ce lien qui d�crit ce que tu m'a dit :

    http://fr.wikipedia.org/wiki/Compression_JPEG

    !!!


    d'autre part pour la fonction destination, jusqu'� mnt je sais pas bien l'�crire:

    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
     
     
     
    BOOL destiMatrix32(
    // VOID const *pcBitmapBits, //[in] Données (pixels) du bitmap 32bits
    BYTE const eMatrice[8][8],		//[in] Matrice  à lire
     int nWidth,               //[in] Largeur du bitmap 32bits en pixels
     int x,                    //[in] Coordonnée X de la matrice 8*8
     int y,                    //[in] Coordonnée Y de la matrice 8*8
     VOID const *pcBitmapBits,      //[out] Matrice  à lire
     enum e_couleur eCouleur   //[in] Couleur à lire
     )
    {
    	if(pcBitmapBits==NULL)
    		return FALSE;
    	if(pMatrice==NULL)
    		return FALSE;
     
    for(int  xx=0 ; xx<8 ; xx++)
    	{
    		for( int yy=0 ; yy<8 ; yy++)
    		{
     
     
    			pcBitmapBits (xx+8*x)+(yy+8*y)*nWidth = eMatrice[xx][yy];
    				RGBQUAD const *pcRgbBits = static_cast< RGBQUAD const * >(pcBitmapBits);
     
    		//M((1+8*i):(8*(i+1)),(1+8*j):(8*(j+1)),k) = M_quantifiee;
    			RGBQUAD const *pcRgb = pcRgbBits + (yy)*nWidth + (xx);
    			switch(eCouleur)
    			{
    			case ROUGE: pcBitmapBits(xx+8*x)+(yy+8*y)*nWidth = pcRgb->rgbRed;   break;
    			case VERT:  pcBitmapBits (xx+8*x)+(yy+8*y)*nWidth  = pcRgb->rgbGreen; break;
    			case BLEU:  pcBitmapBits (xx+8*x)+(yy+8*y)*nWidth  = pcRgb->rgbBlue;  break;
    			}
    		}
    	}
    return TRUE;
    }
    !!!!!!!!

  13. #73
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    1. Pourquoi un tableau de doubles alors que tu �crits des BYTEs ?
    2. Et pour la derni�re fois, ARR�TE avec des "BitmapBits" en sortie! Les donn�es en sortie NE SONT PAS UN BITMAP!!
    3. Et comme je l'ai dit, supprime le suffixe "32" qui ne sert � rien ici. Tu lis ce que je poste, au moins?

    PS: Je viens de regarder le lien sur la DCT: Si tu utilises la formule marqu�e, je pense que tu auras besoin d'une matrice de shorts au lieu de BYTEs.
    PPS: Prend un peu de temps pour re-commenter tout ton code... Et si jamais tu vois un pointeur const en [out], c'est qu'il y a un probl�me... (dans ton code ou dans les commentaires)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #74
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    ok je recomente mon programme

    d'apr�s ce que tu as dis la sortie de destination une une matrce de dimension nb_mat8_larg *8 *nb_mat8_haut*8 !!!!

    et pour la compression huffman qu'elle est son algoritme

    je m'ex�cuse pr le d�rangemet

  15. #75
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    1. � ce stade, je pense que ce n'est plus une matrice, mais un simple buffer. Et j'ignore si les donn�es contenues seront toujours des octets ou s'il faudra des short...
    2. Ne t'occupe pas de compresser pour l'instant. Au pire, tu zippe le fichier de sortie ou tu passes un coup de zlib avant de sauvegarder...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #76
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    j'ai recoment�:
    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
     
    BOOL AjoutMatrix(
     
     BYTE const eMatrice[8][8],         //[in] Matrice 8*8  ==> M88
     int valeur,						 // la valeur à rtrancher lors d la compression
     BYTE pMatrice[8][8]				 //[out] Matrice 8*8 à lire
     ) 
     
    {
     
    	Byte	temp[8][8];
     
    		for (int i=0;i<8;i++)
    			{
    			 for (int j=0;j<8;j++)
    				{
     
     
    				temp[i][j]=1*valeur;
    				 }
    			}
     
    	for(int  xx=0 ; xx<8 ; xx++)
    	{
    		for( int yy=0 ; yy<8 ; yy++)
    		{
    			pMatrice[xx][yy]=eMatrice[xx][yy]  + temp[xx][yy];
    		}
    	}
    		return TRUE;
    }
    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
    BOOL DCTMatrix(
    
     BYTE const eMatrice[8][8],      //[int] Matrice 8*8     M88_128
     BYTE pMatrice[8][8]			//[out] Matrice 8*8 � lire   MDCT   qd je mets shorts il m'affiche un erruer me dis impossible de converir char to shrt   
    )
    {
    
    double c1,c2;
    double pi=3.14;
    for (int xx=0;xx<8;xx++)
    {
        for (int yy=0;yy<8;yy++)
    	{
            for (int i=0;i<8;i++)
    		{
                for (int j=0;j<8;j++)
    			{
                    //Test permettant de determiner la valeur des variables C1 et C2
    				pMatrice[0][0]=0;
                    if (xx==0)
                        c1=1/sqrt(2);
                    else
                        c1=1;
                  
                    if( yy==0)
                        c2=1/sqrt(2);
                    else
                        c2=1;
    				//j'ai cette equation n matlab, je sais pas si j'ai bien convertit en vc++ et j'ai bien respect� les boules!!!
                    
        pMatrice[xx][yy]=pMatrice[xx][yy]+1/sqrt(2*8)*c1*c2*eMatrice[xx][yy]*cos(pi*xx/8*(i/2))*cos(pi*yy/8*(j/2));               
      
    			}
    	
    		}
    	}
    }
    	return TRUE;
    }
    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
     
    BOOL qantiMatrix(
     
     BYTE const eMatrice[8][8],     ////[in] Matrice 8*8 à   M88DCT
     int Fq,
     BYTE pMatrice[8][8]      //[out] Matrice 8*8 à lire  M_Quantifiée
     
     )
    {
     
    	BYTE Q[8][8]; // calcul de la marice de quantification
     
     	for (int i=0;i<8;i++)
    			{
    			 for (int j=0;j<8;j++)
    			 {
     
    	     Q[i][j] = 1 + (( 1 + (i-1) + (j-1)) * Fq);
     
    		}
    	}
    //%quantification : division de la matrice ayant subi la DCT par
                	  //la matrice de quantification
     
    		for(int  xx=0 ; xx<8 ; xx++)
    			{
    			for( int yy=0 ; yy<8 ; yy++)
    				{
     
     
    				pMatrice[xx][yy]=eMatrice[xx][yy]  / Q[xx][yy];  
    				}
    					}
     
     
    		return TRUE;
    }
    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
     
     /////////////////////////////////////////////
    BOOL lirequant(
     
     BYTE const eMatrice[8][8],     ////[in] Matrice 8*8   M88DCT
     
     BYTE tab64[64]                 //[out] Matrice 8*8 à lire  M_Quantifiée
     
     )
    {
     
    		for(int  xx=0 ; xx<8 ; xx++)
    		{
    			for( int yy=0 ; yy<8 ; yy++)
    			{
    				for(int  ww=0 ; ww<8*8 ; ww++)
    					{
     
    			tab64[ww]=eMatrice[xx][yy];
    			}
     
    		}
     
    	}
     
    	return TRUE;
    }
    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
     
    BOOL CImage::Compression(int qualite)
    {
     
    if(BmSrcInfo->biBitCount==32) // 32 bits
    	{
     
     
     for (int x=0 ; x<nb_mat8_larg ; x++)
    	{
    	for (int y=0 ; y<nb_mat8_haut ; y++)
    		{
    		//  -/----------------\-
     
     
    		BYTE M88[8][8];
    		BYTE M88_128[8][8];
    		BYTE M88DCT[8][8];
    		BYTE M_quantifiee[8][8];
    		Get88Matrix32(lpSrcBits, BmSrcInfo->biWidth, x, y, M88, ROUGE);
    		AjoutMatrix(M88, -128, M88_128);
    		DCTMatrix(M88_128, M88DCT);
    		qantiMatrix(M88DCT, qualite, M_quantifiee);
    	//	destiMatrix32(M_quantifiee, BmSrcInfo->biWidth, x, y, lpDestBits, ROUGE);
     
     
    	}
    		}
    dans la bibliotheque que j'utilise CImage, j'ai triuv� ce code concernat buffer
    est ce que je dois sauvgarder de la me fa�on!!
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    //===================================================================
    // Fonctions de sauvegarde de fichier. Activer avec CIMAGE_SAVEFILE
    //===================================================================
     
    #if defined(CIMAGE_SAVEFILE)
     
    // Sauvegarde de l'image sur disque avec le format demandé en paramètre
    BOOL CImage::SaveFile(LPCTSTR szFileName, int nFormat, int nData1, int nData2)
    {
    	if(!szFileName || !szFileName[0])
    		return FALSE;
     
    	if(!m_hDib)
    		return FALSE; // Pas d'image à sauver -> inutile de se fatiguer!!
     
    	if(nFormat>=IMG_FORMAT_END)
    		return FALSE; // Format inconnu au bataillon -> on rentre...
     
    	// Init du buffer de sauvegarde
    	if(!InitSaveBuffer())
    		return FALSE;
     
    	// Ouverture générale du fichier. Le handle est ensuite passé aux sous-fonctions
    	HANDLE hFile=CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
    		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hFile == INVALID_HANDLE_VALUE)
    		return FALSE;
     
    	BOOL bSuccess = FALSE;
    	// Procédure de sauvegarde en fonction du format demandé
    	switch(nFormat)
    	{
    		case IMG_FORMAT_BMPWIN:
    			bSuccess = SaveBMPWIN(hFile);
    			break;
    		case IMG_FORMAT_BMPOS2:
    			bSuccess = SaveBMPOS2(hFile);
    			break;
    		case IMG_FORMAT_RLE:
    			bSuccess = SaveRLE(hFile);
    			break;
    		case IMG_FORMAT_PCX:
    			bSuccess=SavePCX(hFile);
    			break;
    		case IMG_FORMAT_GIF:
    			bSuccess=SaveGIF(hFile);
    			break;
    		case IMG_FORMAT_JPEG:
    			#if defined(CIMAGE_USE_JPEG)
    				bSuccess = SaveJPEG(hFile, nData1);
    			#endif
    			break;
    		case IMG_FORMAT_TIFF:
    			#if defined(CIMAGE_USE_TIFF)
    				bSuccess = SaveTIFF(hFile, szFileName, nData1);
    			#endif
    			break;
    		case IMG_FORMAT_TGA:
    			bSuccess=SaveTGA(hFile, nData1);
    			// nData1 contient le type de compression à utiliser
    			break;
    		case IMG_FORMAT_PNG:
    			#if defined(CIMAGE_USE_PNG)
    				bSuccess = SavePNG(hFile);
    			#endif
    			break;
    	}
     
    	// Flush et destruction du buffer
    	if(!FlushSaveBuffer(hFile, bSuccess))
    		bSuccess=FALSE;
     
    	// Le type de format est remis à jour ici, pas dans les sous-fonctions
    	if(bSuccess)
    		m_nFileFormat = nFormat;
     
    	// Fermeture du fichier en cours
    	CloseHandle(hFile);
     
    	// Si la sauvegarde a échoué -> on supprime le fichier créé vide
    	if(!bSuccess)
    		DeleteFile(szFileName);
     
    	return bSuccess;
    }
     
    // Init du buffer de sauvegarde. Les fonctions de bufferisation permettent
    //  de limiter les accès disques et d'accelérer ainsi les sauvegardes
    BOOL CImage::InitSaveBuffer()
    {
    	// On vérifie que m_LoadBuffer n'est pas déjà utilisé
    	if(m_LoadBuffer)
    		return FALSE;
     
    	// Réserve de la mémoire avec taille standard de 10ko
    	if(!(m_LoadBuffer=malloc(SIZE_SAVE_BUFFER)))
    		return FALSE;
     
    	// OK -> on ramène TRUE
    	memset(m_LoadBuffer, 0, SIZE_SAVE_BUFFER);
    	m_dwSaveBufferLen = NULL;
    	return TRUE;
    }
     
    // Place des octets à sauver du disque dans le buffer. Si le buffer est
    //  plein, il est écrit sur disque et vidé
    BOOL CImage::WriteSaveBuffer(HANDLE hFile, LPVOID Buffer, DWORD nLen)
    {
    	// !! Ne jamais appeler cette fonction si m_LoadBuffer n'est pas valide
    	// !! Pour augmenter la rapidité, aucune vérification sur la validité
    	//  des données n'est effectuée
     
    	// Copie des octets 1 à 1 dans le buffer
    	for(DWORD i=0; i<nLen; )
    	{
    		((BYTE*)m_LoadBuffer)[m_dwSaveBufferLen++]=((BYTE*)Buffer)[i++];
     
    		// Si on dépasse le buffer, on écrit et on vide
    		if(m_dwSaveBufferLen>=SIZE_SAVE_BUFFER)
    		{
    			DWORD dwByteWrite;
    			if(!WriteFile(hFile, m_LoadBuffer, m_dwSaveBufferLen,
    					&dwByteWrite, NULL)
    					|| dwByteWrite!=m_dwSaveBufferLen)
    				return FALSE;
    			memset(m_LoadBuffer, 0, SIZE_SAVE_BUFFER);
    			m_dwSaveBufferLen = NULL;
    		}
    	}
    	return TRUE;
    }
     
    // Force l'écriture des données sur disque et détruit le buffer
    // Si bWrite==FALSE, seulement destruction, pas d'écriture
    BOOL CImage::FlushSaveBuffer(HANDLE hFile, BOOL bWrite)
    {
    	// Si buffer inexistant -> on rentre
    	if(!m_LoadBuffer)
    		return FALSE;
     
    	BOOL bSuccess = TRUE;
     
    	// Ecriture des données sur disque
    	if(bWrite && m_dwSaveBufferLen)
    	{
    		DWORD dwByteWrite;
    		if(!WriteFile(hFile, m_LoadBuffer, m_dwSaveBufferLen,
    				&dwByteWrite, NULL)
    				|| dwByteWrite!=m_dwSaveBufferLen)
    			bSuccess = FALSE;
    	}
     
    	// Destruction du buffer et sortie
    	free(m_LoadBuffer);
    	m_LoadBuffer=NULL;
    	return bSuccess;
    }

  17. #77
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Mais c'est pas possible...

    On peut savoir pourquoi tu utilises une matrice temporaire?
    Et puis, la formule montr�e dans wikip�dia ne parle nulle part de cet ajout. Es-tu s�r que cette fonction est utile?

    J'ai r�impl�ment� la formule de DCT trouv�e sur Wikip�dia: Elle prend une matrice de BYTE en entr�e et une matrice de SHORT en sortie:
    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
    static double sousFoncDCT(
     BYTE const eMatrice[8][8], //[in] Matrice 8*8 d'entrée
     int const i,               //[in]
     int const j                //[in]
     )
    {
    	double const pi=3.14159265358979323846;
    	double ret = 0.0;
     
    	for(int x=0 ; x<8 ; x++)
    	{
    		double leCosinusX = cos( ((2*x+1)*i*pi) / (2*8) );
     
    		for(int y=0 ; y<8 ; y++)
    		{
    			double leCosinusY = cos( ((2*y+1)*j*pi) / (2*8) );
    			ret += (eMatrice[x][y] * leCosinusX * leCosinusY);
    		}
    	}
    	return ret;
    }
     
    void DCTMatrice(
     BYTE const eMatrice[8][8], //[in] Matrice 8*8 d'entrée
     short pMatrice[8][8]       //[out] Matrice 8*8 transformée
     )
    {
    	//Formule de la DCT sur wikipédia
    	//(je ne connais pas tous les détails)
     
    	for(int i=0 ; i<8 ; i++)
    	{
    		double ci = (i==0 ? 1.0/sqrt(2) : 1.0);
     
    		for(int j=0 ; j<8 ; j++)
    		{
    			double cj = (j==0 ? 1.0/sqrt(2) : 1.0);
     
    			pMatrice[i][j] = static_cast< short >(
    			 (2.0/8.0) * ci * cj * sousFoncDCT(eMatrice, i, j)
    			 );
    		}
    	}
    }
    Tu vois, en s�parant les calculs, c'est tout de suite plus clair.


    Et pour la quantification:
    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
    static void GenererMatriceQuantif(
     int Fq,              //[in] Facteur de génération
     short qMatrice[8][8] //[out] Matrice de quantification
     )
    {
    	for (int i=0 ; i<8 ; i++)
    	{
    		for (int j=0 ; j<8 ; j++)
    		{
    			//Un algo que je ne connais pas pour générer la matrice
    			qMatrice[i][j] = static_cast< short >(
    			 1 + (( 1 + (i-1) + (j-1)) * Fq);
    			 );
    		}
    	}
    }
     
     
    static void DisisionMembreAMembre(
     short const matDividendes[8][8], //[in] Matrice des dividendes
     short const matDiviseurs[8][8],  //[in] Matrice des diviseurs
     short matQuotients[8][8]         //[out] Matrice des quotients
     )
    {
    	for (int i=0 ; i<8 ; i++)
    	{
    		for (int j=0 ; j<8 ; j++)
    		{
    			//Division arrondie à l'entier le plus proche
    			matQuotients[i][j] = (matDividendes[i][j] + matDiviseurs[i][j]/2) / matDiviseurs[i][j];
    		}
    	}
    }
     
     
    void QuantiMatrice(
     short const eMatrice[8][8], //[in] Matrice 8*8 à quantifier
     int Fq,                     //[in] Facteur pour générer la matrice de quantification
     short pMatrice[8][8]        //[out] Matrice 8*8 Quantifiée
     )
    {
    	short Q[8][8]; 
    	GenererMatriceQuantif(Fq, Q);
     
    	//%quantification : division de la matrice ayant subi la DCT 
    	//par la matrice de quantification
    	DisisionMembreAMembre(eMatrice, Q, pMatrice);
    }
    C'est pourtant simple, comme code, non?
    Si tu n'es pas capable de comprendre �a, tu ne devrais plus toucher au C++ jusqu'� l'�tre. Car sache-le, ton code est un vrai torchon.

    Pour la sortie, pour l'instant je conseille de lire la matrice en diagonale comme montr� sur wikip�dia, puis de l'�crire dans un fichier. Ensuite, traiter une autre matrice, �crire � la suite, etc.
    Et � la fin, compresser le tout.

    PS: Il est fort possible qu'apr�s quantification, les donn�es tiennent dans un signed char. Mais comme je n'ai pas test�, je n'en suis pas certain.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #78
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    en effet, moi j'ai rouv� 2 lien de compression Jpeg
    celui de wikip�dia qui ne toucha pas la matrice de l'ajout

    et celui qui explique cette compression mais enmatlab, il cosid�re cet fonction
    ennonce:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
     
     
    Pour pouvoir retrancher 128 lors de la compression ou ajouter 128 lors de la décompression à tous les coefficients de la matrice, nous allons utiliser la fonction ajoute(m, valeur) qui ajoutera "valeur" à tous les coefficients de la matrice m:
    je sais qui est la plus exacte;

    pour tes codes , je l'ai bien compris, mnt qu'on tu as divis� en fonction , il devient plus simple
    je te remercie

    concernat la suvgarde en fichier( buffer), franchement je sais pas d'ou je part
    j'ai jamis essaier de faire �a

  19. #79
    Membre �clair� Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Par d�faut
    j'�cris ce code qui lit une matriceen zigzag, et j'ai stok� les valeurs ds un tableau 64octet:!!!!!!!!!

    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
     
    void generation_mat_zigzag(
     
    BYTE  eMatrice[8][8],		//[in] Matrice  à lire
     int x,                    //[in] Coordonnée X de la matrice 8*8
     int y,						//[in] Coordonnée Y de la matrice 8*8
     BYTE tab64[64]
     
     )
    {	
    	int ww,i;
     
      int max=8;
     
      for (x=0; x<=max; x++)
      {
        for (y=0; y<=x; y++) 
     
    	{
    		for (ww=0; ww<64; ww++) 
     
    			{
    		if   (x%2==1)
     
     
    			tab64[ww]=	eMatrice[y][x-y];
     
    		else
     
    			tab64[ww]=	eMatrice[x-y][y];
     
    		}
    	}
      }
     
     
     
    }
    et pour la comression RLE et huffman, je sais pas cmt ls faires , et aussi stoker les valeurs ds un buffer

  20. #80
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Vu l'�tat de tes boucles, ta fonction est mauvaise. Tu as 64� it�rations alors qu'il en faut 64 en tout.

    Et juste pour �tre s�r : Est-ce qu'au moins, tu sais ce qu'on appelle un buffer ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [cat] Concat�nation de matrices d'images
    Par Mamadou1 dans le forum Images
    R�ponses: 1
    Dernier message: 20/10/2007, 20h29
  2. R�ponses: 43
    Dernier message: 14/06/2007, 17h56
  3. Transformer une matrice � une image
    Par stiko83 dans le forum C++
    R�ponses: 24
    Dernier message: 01/08/2006, 23h11

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