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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    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