Attends.
Qu'est-ce que tu dois diviser par une matrice: L'image enti�re ou la petite matrice 8*8 extraite de l'image?
Version imprimable
Attends.
Qu'est-ce que tu dois diviser par une matrice: L'image enti�re ou la petite matrice 8*8 extraite de l'image?
je dois diviser la petite matrice extraite8*8 par la matrice q
ect ce que si possible d'ecrire :
M_quantifiee = M88/Q;
Non.
Du moins, pas si M88 est un simple tableau � deux dimensions.
Par contre, si M88 est une instance d'une classe de matrice, peut-�tre que la classe en question red�finit l'op�rateur '/' pour la division matricielle...
M88 c'est la matrice 8*8 qu'on a calcul� par:
et ce possible de mettre M_128=M88/Q;Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 for (x=0 ; x<nb_mat8_larg ; x++) { for (y=0 ; y<nb_mat8_haut ; y++) { //Parcours de la zone 8*8 for( xx=0+8*x ; xx<8+8*x ; xx++) { for( yy=0+8*y ; yy<8+8*y ; yy++) { RGBQUAD *pPixel = &pRgb[ yy*pBmi->bmWidth + xx ]; M88=RGBQUAD *pPixel ;
avec Q:
Code:
1
2
3
4
5
6
7
8 for (i=1;i<8;i++) for (j=1;j<8;j++) { Q[i][j]= 1 + (( 1 + (i-1) + (j-1)) *10); }
- �a ne me montre pas la d�claration de M88
�a compile, �a?Code:M88=RGBQUAD *pPixel ;
non non cela donne uner erreur bien sur
moi je te montre juste l'algorithme
on ne peut pas faire affectation comme cela en vc++
C'est bien ce qui me semblait.
Donc, M88 est d�clar� comment?
je sais pas si je fais ce truc , est ce qu' il va marcher
:
??????????Code:
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 LPBITMAPINFOHEADER BmSrcInfo=(LPBITMAPINFOHEADER)GlobalLock(m_hDib); LPBITMAPINFO biSrc=(LPBITMAPINFO)BmSrcInfo; LPBITMAPINFOHEADER BmDestInfo=(LPBITMAPINFOHEADER)GlobalLock(hNewDib); LPBITMAPINFO biDest=(LPBITMAPINFO)BmDestInfo; int nb_mat8_larg = BmSrcInfo->biHeight/8; //nombre de matrice 8x8 dans la hauteur de l'image int nb_mat8_haut = BmSrcInfo->biWidth/8; for (i=1;i<8;i++) for (j=1;j<8;j++) { Q[i][j]= 1 + (( 1 + (i-1) + (j-1)) * qualite); } BYTE* lpSrcBits = (BYTE*)BmSrcInfo+BmSrcInfo->biSize+nColors*sizeof(RGBQUAD); for (x=0 ; x<nb_mat8_larg ; x++) { for (y=0 ; y<nb_mat8_haut ; y++) { //Parcours de la zone 8*8 for( xx=0+8*x ; xx<8+8*x ; xx++) { for( yy=0+8*y ; yy<8+8*y ; yy++) { BYTE *lpSrcBits = lpSrcBits[ yy*pBmi->bmWidth + xx ]; lpDestBits[yy*nScanWidth+xx ]=lpSrcBits[yy*nScanWidth+xx]; pDestBits->mSrcInfo=M88
Je ne vois pas trop ce que tu cherches � faire, l�...
Et tu n'as toujours pas r�pondu � ma question: Comment est d�clar� (et d�fini) M88 ?
ce que je veux faire
c de prendre une image
divise en bloc 8*8 (M88)
applique l'algorithme DCt sur chaque bloc (M_DCT)
diviser cette matrice par Q (m_Quantifiee)=M_DCT/Q)
voila l'algorithe
mnt je vx programmer �a en vc++
jusq'au mnt je sais pas comment declarer M88
en matlab , juste on joue sur les matrices
ici c pas le cas:? :?
voila mon grand pb!!!!!!!!!!!
Tu peux toujours chercher sur le net une biblioth�que de calcul matriciel.
Sinon, tu d�clare M88 comme un b�te tableau � deux dimensions, et tu fais les calcules (divisions,etc.) manuellement.
oui, je pr�f�re ce deuxi�me choix , c de declarer M88 comme une matrice 8*8
mais il reste tjs le pb d'affectation , car dans mon programme j'ai enoremement des affectations :? :?
Eh bien pour affecter depuis le bitmap, c'est une affectation terme � terme (64 affectation par zone de 8*8).
Et pour copier une matrice 8*8 dans une autre, un simple memcpy() peut suffire.
j'ecris ce code mias je sais s'il m'aider
:oops: :oops:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 if(BmSrcInfo->biBitCount==32) // de 32 vers 24 bits { for(int y=0; y<BmDestInfo->biHeight; y++) { BYTE* lpSrc = lpSrcBits + (y*nScanWidthSrc); BYTE* lpDest = lpDestBits + (y*nScanWidthDest); for(int x=0; x<BmDestInfo->biWidth; x++) { *(lpDest++) = *(lpSrc++); *(lpDest++) = *(lpSrc++); *(lpDest++) = *(lpSrc++); lpSrc++; // on saute un octet pour chaque pixel } } } // ou bien juste // Copie du Header + palette ds le nouveau bitmap CopyMemory(biDest, biSrc, BmSrcInfo->biSize+nColors*sizeof(RGBQUAD));
Je ne sais pas si �a ira tr�s bien, car il y a des contraintes d'alignement.
Ce que je te conseillerais, c'est de cr�er un bitmap 32 bits avec CreateDIBSection(), et de lui passer les donn�es 24 bits avec SetDIBits(). Ensuite, tu appelles GdiFlush() et hop, tu peux travailler sur tes donn�es 32 bits.
aaaaaah merci
j'essaire d'appliquer ce methode
et esperons qu'ele marche
merci
svp , j'ai une question
commnt je peux obtenir une image de valeur pseudo aleatoire (random)
de taille quelqconque ( 256*256 ou bien 512*512.....)
:oops:
Pour l�, je ne vois pas trente-six solutions: � la main.
Le plus rapide � programmer, je pense, c'est de faire �a directement pour toute la zone m�moire, octet par octet, sans se pr�occuper de la taille d'un pixel (on calcule une fois la taille de la m�moire et hop, c'est parti, on �crit n'imp dedans).
L'inconv�nient sur les bitmaps 32bits, c'est que l'octet suppl�mentaire se retrouve lui aussi � une valeur al�atoire (mais si tu ne fais pas d'Alpha Blending, il me semble qu'il est tout simplement ignor�).
il y a une fonction qui faire �a
en matlab la fonction randn permet de generer une sequence pseudo aleatoire
est ce que c la meme chos en vc++
Sinon, tu peux aussi utiliser CryptGenRandom(), mais je doute que �a vaille la peine de mettre en branle la CryptoAPI juste pour cette fonction...