⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.cpp

📁 可以选择各种压缩方式对读入的图像进行压缩和解压
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//srcfile.read((char*)&newdcCode->diffValue,sizeof(short));
	 //   srcfile.read((char*)&length,sizeof(unsigned short));
	 //   srcfile.read((char*)&dbyte,sizeof(unsigned));
	fread(&newdcCode->diffValue,sizeof(short),1,srcfile);
	fread(&length,sizeof(unsigned short),1,srcfile);
	fread(&dbyte,sizeof(unsigned),1,srcfile);

		newdcCode->code=new char[length+1];
		if(newdcCode->code==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
		}
		for(int i=length-1;i>=0;i--){
			if((dbyte>>i)&1){
				newdcCode->code[length-i-1]='1';
			}
			else {newdcCode->code[length-i-1]='0';}
		}
		newdcCode->code[length]='\0';
		newdcCode->count=0;
		newdcCode->next=NULL;                        
		pdcCode->next=newdcCode;               //新节点加入链表末尾
		pdcCode=newdcCode;                     //工作指针移位至链尾
	}
/*-----------------------------------建立AC码表---------------------------------------*/	
	dbyte=0;
	length=0;
	//srcfile.read((char*)&acCodeListlength,sizeof(cltype));
	fread(&acCodeListlength,sizeof(cltype),1,srcfile);

	decodeListStruct* acCodeHead=new decodeListStruct;
	if(acCodeHead==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	}
	//srcfile.read((char*)&acCodeHead->ep.run,sizeof(unsigned short));
    //srcfile.read((char*)&acCodeHead->ep.level,sizeof(btype));
	//srcfile.read((char*)&length,sizeof(unsigned short));
	//srcfile.read((char*)&dbyte,sizeof(unsigned));
	fread(&acCodeHead->ep.run,sizeof(unsigned short),1,srcfile);
	fread(&acCodeHead->ep.level,sizeof(btype),1,srcfile);
	fread(&length,sizeof(unsigned short),1,srcfile);
	fread(&dbyte,sizeof(unsigned),1,srcfile);


	acCodeHead->code=new char[length+1];
	if(acCodeHead->code==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	}
	for(int i=length-1;i>=0;i--){
		if((dbyte>>i)&1){
			acCodeHead->code[length-i-1]='1';
			}
			else {acCodeHead->code[length-i-1]='0';}
	}
	acCodeHead->code[length]='\0';
	acCodeHead->times=0;                     //将次数赋值为0
	acCodeHead->next=NULL;
	decodeListStruct* pacCode=acCodeHead;          //工作指针
	for(cltype i=0;i<acCodeListlength-1;i++)
	{
		dbyte=0;
		length=0;
		
		decodeListStruct* newacCode=new decodeListStruct;    //新生成的节点
		if(newacCode==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	  }
		//srcfile.read((char*)&newacCode->ep.run,sizeof(unsigned short));
  //      srcfile.read((char*)&newacCode->ep.level,sizeof(btype));
	 //   srcfile.read((char*)&length,sizeof(unsigned short));
	 //   srcfile.read((char*)&dbyte,sizeof(unsigned));
	fread(&newacCode->ep.run,sizeof(unsigned short),1,srcfile);
	fread(&newacCode->ep.level,sizeof(btype),1,srcfile);
	fread(&length,sizeof(unsigned short),1,srcfile);
	fread(&dbyte,sizeof(unsigned),1,srcfile);


		newacCode->code=new char[length+1];
		if(newacCode->code==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	  }
		for(int i=length-1;i>=0;i--){
			if((dbyte>>i)&1){
				newacCode->code[length-i-1]='1';
			}
			else {newacCode->code[length-i-1]='0';}
		}
		newacCode->code[length]='\0';
		newacCode->times=0;
		newacCode->next=NULL;                        
		pacCode->next=newacCode;               //新节点加入链表末尾
		pacCode=newacCode;                     //工作指针移位至链尾
	}
	
	BinaryTree dcTree,acTree;
	dcTree.CreateDC(dcCodeHead,dcCodeListlength);
	acTree.CreateAC(acCodeHead,acCodeListlength);


/*--------------------------------------------直流反翻译------------------------------------------*/	
	blstype blocksize;                      //直流符号流长度
	blstype dcCount=0;                      //对解码的直流差分值进行计数
	Node* tempP=dcTree.root;                 //工作指针,初始化为指向树的根节点
	if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
		cout<<"DC解码树为空!"<<endl;
		exit(1);
	}
	unsigned char buffer;                            //数据缓存
	
	//srcfile.read((char*)&blocksize,sizeof(blstype));
	fread(&blocksize,sizeof(blstype),1,srcfile);
	
	
	dcDiff=new short [blocksize];
	if(dcDiff==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	}

	//unsigned long srcfilecur=srcfile.cur;

	//srcfile.read((char*)&buffer,1);              //跳过换行符
	//srcfile.read((char*)&buffer,1);              //跳过换行符
	while(dcCount<blocksize){
		//srcfile.read((char*)&buffer,sizeof(unsigned char));
		fread(&buffer,sizeof(unsigned char),1,srcfile);
		if(!srcfile)break; //srcfile.eof()
		for(int i=7;i>=0;i--){
			if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
				dcDiff[dcCount]=tempP->diffValue;
				if (dcCount<blocksize-1)
					dcCount++;
				else {
					dcCount++;
					break;
				}
				tempP=dcTree.root;                //完成一次查找,指针归位
				if((buffer>>i)&1){                //当前此位的比较不可遗漏
				tempP=tempP->rchild;
			}
				else {
					tempP=tempP->lchild;
				}
				//continue;
			}
			else if((buffer>>i)&1){
				tempP=tempP->rchild;
			}
				else {
					tempP=tempP->lchild;
				}
		}
	}
//	for(int i=0;i<blocksize;i++)cout<<'['<<i<<"]:"<<dcDiff[i]<<'\t';
	
	//int tempeof=srcfile.eof();

/*----------------------------------------交流反翻译--------------------------------------------*/
	unsigned long acsl=12,acCount=0;

	//srcfile.read((char*)&acsl,sizeof(unsigned long));
		fread(&acsl,sizeof(unsigned long),1,srcfile);

	
	tempP=acTree.root;                 //工作指针,初始化为指向树的根节点
	if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
		cout<<"AC解码树为空!"<<endl;
		exit(1);
	}
	acSymbolHead=new symbolStreamStruct;    //符号流头节点
	if(acSymbolHead==NULL){
			cout<<"空间不足"<<endl;
			exit(1);
	}
	symbolStreamStruct *tempACSymbol=acSymbolHead;    //符号流工作指针
	while((srcfile)&&(acCount<acsl)){ //srcfile.eof()==0
		//srcfile.read((char*)&buffer,sizeof(unsigned char));
		fread(&buffer,sizeof(unsigned char),1,srcfile);

		if(!srcfile)break; //srcfile.eof()!=0
		for(int i=7;i>=0;i--){
			if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
				//dcDiff[dcCount]=tempP->diffValue;
				//dcCount++;
				tempACSymbol->e.run=tempP->Event.run;
				tempACSymbol->e.level=tempP->Event.level;
				symbolStreamStruct *newACSymbol=new symbolStreamStruct;
				if(newACSymbol==NULL){
			      cout<<"空间不足"<<endl;
			      exit(1);
	      }
				newACSymbol->next=NULL;           //符号流链尾会有一个空节点
				tempACSymbol->next=newACSymbol;   //入链
				tempACSymbol=newACSymbol;
				if (acCount<acsl-1)
					acCount++;
				else {
					acCount++;
					break;
				}
				tempP=acTree.root;                //完成一次查找,指针归位
				if((buffer>>i)&1){                //当前此位的比较不可遗漏
				  tempP=tempP->rchild;
			  }
				else {
					tempP=tempP->lchild;
				}
				//continue;
			}
			else if((buffer>>i)&1){
				tempP=tempP->rchild;
				}
				else {
					tempP=tempP->lchild;
					}
		}
	}
	//srcfile.close();
	fclose(srcfile);
/*-------------------------------------释放码表-------------------------------------*/
	pdcCode=dcCodeHead->next;
	while(pdcCode!=NULL){
		delete []dcCodeHead->code;
		//delete []dcCodeHead->code;
		delete dcCodeHead;
		dcCodeHead=pdcCode;
		pdcCode=pdcCode->next;
	}
	delete []dcCodeHead->code;
    delete dcCodeHead;
  
    pacCode=acCodeHead->next;
	while(pacCode!=NULL){
		delete []acCodeHead->code;
		//delete []acCodeHead->code;
		delete acCodeHead;
		acCodeHead=pacCode;
		pacCode=pacCode->next;
	}
	delete []acCodeHead->code;
	//delete []acCodeHead->code;
    delete acCodeHead;
	
	return width*height/64;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -