//进行压缩 对图像进行编码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *imageFile,*outFile;
int i, data, nextData;
int cnt = 0;
if ((imageFile = fopen("Lena.bmp","rb")) == NULL) {
printf("can't open Lena.bmp\n");
exit(1);
}
if ((outFile = fopen("Lena.cod","wb")) == NULL) {
printf("can't open Lena.cod\n");
exit(1);
}
while (!feof(imageFile))
{
data = fgetc(imageFile);
cnt++;
if (cnt >= 1078) {
cnt = 1;
//first identifer---white pixel or black pixel
fputc(data, outFile);
while (!feof(imageFile)) {
nextData = fgetc(imageFile);
if (data != nextData) {
//output two bytes
//the first one is Low byte
fputc(cnt % 256, outFile);
//the second one is High byte
cnt /= 256;
fputc(cnt, outFile);
cnt = 0;
//exchange
data = nextData;
}
cnt++;
}
goto closeFile;
}
fputc((char)data,outFile);
}
closeFile:
if (fclose(imageFile)) exit(1);
if (fclose(outFile)) exit(1);
system("pause");
return 0;
}
压缩后文件只有24K
//反编码 恢复图像
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *imageZipFile,*outFile;
int i, data, nextData, identifer;
int cnt = 0;
if ((imageZipFile = fopen("Lena.cod", "rb")) == NULL) {
printf("can't open Lena.cod\n");
exit(1);
}
if ((outFile = fopen("RecoveryLena.bmp", "wb")) == NULL) {
printf("can't open RecoveryLena.bmp\n");
exit(1);
}
while (!feof(imageZipFile))
{
data = fgetc(imageZipFile);
cnt++;
if (cnt >= 1078) {
identifer = data;
while (!feof(imageZipFile)) {
data = fgetc(imageZipFile);
nextData = fgetc(imageZipFile);
cnt = nextData * 256 + data;
for (i = 0; i < cnt; i++) {
fputc(identifer, outFile);
}
identifer ^= 0x00ff;
}
goto closeFile;
}
fputc((char)data,outFile);
}
closeFile:
if (fclose(imageZipFile)) exit(1);
if (fclose(outFile)) exit(1);
system("pause");
return 0;
}