Principles of Compression
Types of Compression
Run Lenght Cell
typedef struct RLEdatum {
unsigned char cnt;
Pixel pix;
} RLEdatum;
Compression
void rle_write(int fd, Image *i)
{
RLEdatum r;
int u, v, c;
for (v = 0; v < i->h; v++) {
r.pix = img_geti(i, 0, v); r.cnt = 1;
for (u = 1; u < i->w; u++) {
if (r.cnt < 255 && (c = img_geti(i, u, v)) == r.pix) {
r.cnt++;
} else {
write(fd, &r, sizeof(RLEdatum));
r.pix = c; r.cnt = 1;
}
}
write(fd, &r, sizeof(RLEdatum));
}
}
Decompression
void rle_read(int fd, Image *i)
{
RLEdatum r;
int u = 0, v = 0;
while (read(fd, &r, sizeof(RLEdatum))) {
do {
img_puti(i,u,v,r.pix);
if (++u == i->w) {
u = 0; v++;
}
} while (--r.cnt);
}
}