forked from sgerin/DCT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jpg.c
196 lines (135 loc) · 3.62 KB
/
jpg.c
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include "matrice.h"
#include "dct.h"
#include "jpg.h"
#include "image.h"
/*
* Calcul de la DCT ou de l'inverse DCT sur un petit carré de l'image.
* On fait la transformation de l'image ``sur place'' c.a.d.
* que le paramètre "image" est utilisé pour l'entrée et la sortie.
*
* DCT de l'image : DCT * IMAGE * DCT transposée
* Inverse : DCT transposée * I' * DCT
*/
void dct_image(int inverse, int nbe, float **image)
{
}
/*
* Quantification/Déquantification des coefficients de la DCT
* Si inverse est vrai, on déquantifie.
* Attention, on reste en calculs flottant (en sortie aussi).
*/
void quantification(int nbe, int qualite, float **extrait, int inverse)
{
}
/*
* ZIGZAG.
* On fournit à cette fonction les coordonnées d'un point
* et elle nous donne le suivant (Toujours YX comme d'habitude)
*
* +---+---+---+---+ +---+---+---+
* |00 |01 | | | | | | |
* | ----/ | /---/ | | ----/ | | |
* | |/ |/ |/ | | |/ |/| |
* +---/---/---/---+ +---/---/-|-+
* |10/| /| /| | | /| /| | |
* | / | / | / | | | | / | / | | |
* | | |/ |/ |/| | | | |/ |/ |
* +-|-/---/---/-|-+ +-|-/---/---+
* | |/| /| /| | | | |/| /| |
* | / | / | / | | | | / | ----- |
* | |/ |/ |/ | | | | |
* +---/---/---/---+ +---+---+---+
* | /| /| /| |
* | /---/ | /---- |
* | | | | |
* +---+---+---+---+
*/
void zigzag(int nbe, int *y, int *x)
{
}
/*
* Extraction d'une matrice de l'image (le résultat est déjà alloué).
* La sous-image carrée à la position et de la taille indiquée
* est stockée dans matrice "extrait"
*/
static void extrait_matrice(int y, int x, int nbe
, const struct image *entree
, float **extrait
)
{
int i, j ;
for(j=0;j<nbe;j++)
for(i=0;i<nbe;i++)
if ( j+y < entree->hauteur && i+x < entree->largeur )
extrait[j][i] = entree->pixels[j+y][i+x] ;
else
extrait[j][i] = 0 ;
}
/*
* Insertion d'une matrice de l'image.
* C'est l'opération inverse de la précédente.
*/
static void insert_matrice(int y, int x, int nbe
, float **extrait
, struct image *sortie
)
{
int i, j ;
for(j=0;j<nbe;j++)
for(i=0;i<nbe;i++)
if ( j+y < sortie->hauteur && i+x < sortie->largeur )
{
if ( extrait[j][i] < 0 )
sortie->pixels[j+y][i+x] = 0 ;
else
{
if ( extrait[j][i] > 255 )
sortie->pixels[j+y][i+x] = 255 ;
else
sortie->pixels[j+y][i+x] = rint(extrait[j][i]) ;
}
}
}
/*
* Compression d'une l'image :
* Pour chaque petit carré on fait la dct et l'on stocke dans un fichier
*/
void compresse_image(int nbe, const struct image *entree, FILE *f)
{
static float **tmp = NULL ;
int i, j, k ;
if ( tmp == NULL )
{
tmp = allocation_matrice_carree_float(nbe) ;
}
for(j=0;j<entree->hauteur;j+=nbe)
for(i=0;i<entree->largeur;i+=nbe)
{
extrait_matrice(j, i, nbe, entree, tmp) ;
dct_image(0, nbe, tmp) ;
for(k=0; k<nbe; k++)
assert(fwrite(tmp[k], sizeof(**tmp), nbe, f) == nbe) ;
}
}
/*
* Décompression image
* On récupère la DCT de chaque fichier, on fait l'inverse et
* on insère dans l'image qui est déjà allouée
*/
void decompresse_image(int nbe, struct image *entree, FILE *f)
{
static float **tmp = NULL ;
int i, j, k ;
if ( tmp == NULL )
{
tmp = allocation_matrice_carree_float(nbe) ;
}
for(j=0;j<entree->hauteur;j+=nbe)
for(i=0;i<entree->largeur;i+=nbe)
{
for(k=0; k<nbe; k++)
assert(fread(tmp[k], sizeof(**tmp), nbe, f) == nbe) ;
dct_image(1, nbe, tmp) ;
insert_matrice(j, i, nbe, tmp, entree) ;
}
}