学习C语言——栅格数据的块码压缩

/*
	Block coding
	2012-03-08——20:55
*/
#include 
  
  
   
   
#include 
   
   
    
    

typedef struct _feature
{
	char ch;	//用来存储像素值
	bool flag;	//用来标识是否已编码,如果已编码则为false,否则为true
}FT, * PFT, **PPFT;

typedef struct _block
{
	int x, y;	//标识块的左上角标
	int n;		//标识块的边长大小
}BLOCK, *PBlock;

bool isBlock(PPFT ft, int m, int n, int s, int t, int num);
int getNum(PPFT ft, int m, int n, int s, int t);
void setFlagFalse(PPFT ft, int s, int t, int num);
void code(PPFT ft, int m, int n);
//void uncode(PPFT ft, int m, int n);

int main(void)
{
	int m, n, i, j;
	char tmpch;
	FILE * fp;
	if((fp=fopen("Sources.txt", "r"))==NULL)
		exit(-1);

	fscanf(fp, "%d %d", &m, &n);
	printf("m=%d\tn=%d\n", m, n);

	PPFT pCh=(PPFT)malloc(sizeof(PFT)*m);
	if(pCh==NULL)
		exit(-1);

	for(i=0; i<m; i++)
	{
              tmpch = fgetc(fp); //这里一定要做处理,因为其中还包含'\n'被读取
              *(pCh+i) = (PFT)malloc(sizeof(FT)*n);
              if(*(pCh+i)==NULL)
                   exit(-1);
              for(j=0; j<n; j++)
             {
                  fscanf(fp, "%c", &(*(pCh+i)+j)->ch);
                  (*(pCh+i)+j)->flag = true;	
             }

	for(i=0; i<m; i++)
	{
		for(j=0; j
    
    
     
     ch);
		printf("\n");
	}

	code(pCh, m, n);

	return 0;
}

//看指定的num大小块是否整块数据都是同一属性
bool isBlock(PPFT ft, int m, int n, int s, int t, int num)	//s,t标识起始下标
{
	bool flag = true;

	if(s+num>m+1 || t+num>n+1)
		flag = false;

	if(flag)
	{
		for(int i=0; i<num;i++)
		{
			for(int j=0; j
     
     
      
      ch!=(*(ft+s)+t)->ch) || !((*(ft+s+i)+t+j)->flag) )	//如果存在已编码或者字符特征不相等的
				{
					flag = false;
					break;
				}
			if(!flag)
				break;
		}
	}

	return flag;
}

//获取块的大小
int getNum(PPFT ft, int m, int n, int s, int t)
{
	int i;
		
	for(i=1; i>0; i++)
	{
		if(!isBlock(ft, m, n, s, t, i))
			break;
	}
	if(i==1)
		return i;
	else
		return --i;
}

//对于已经判断是相同属性的块进行flag属性设置
void setFlagFalse(PPFT ft, int s, int t, int num)
{
	for(int i=0; i<num; i++)
		for(int j=0; j
      
      
        flag = false; return ; } //进行编码 void code(PPFT ft, int m, int n) //进行编码 { int i, j, tmpNum; for(i=0; i<m; i++) { for(j=0; j 
       
         flag ) { tmpNum = getNum(ft, m-1, n-1, i, j); printf("%d,%d,%d,%c ", i+1, j+1, tmpNum, (*(ft+i)+j)->ch); setFlagFalse(ft, i, j, tmpNum); } } printf("\n"); } return ; } 
        
      
     
     
    
    
   
   
  
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值