图像压缩(行程编码)

图像压缩(行程编码)

利用行程编码对图像进行压缩

//进行压缩 对图像进行编码
#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;
}

 恢复后的图像

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值