c 实现jpeg中的ALI(可变长度整数转换)正反向转换

用于DC的ALI表:DIFF 就是前后两个8X8块DC的差值,ssss就是DIFF值用二进制表示的位数

亮度,与色度的DC都是这种处理的。两个相邻的亮度与亮度比差,色度与色度比差产生DIFF,

扫描开始DIFF等于0。

c 实现jpeg中的ALI(可变长度整数转换)正反向转换_第1张图片

用于AC ALI表:表中的AC 就是Z变换后(a,b)对中的b。ssss 是b值用2进制表示的位数

亮度与色度的AC都是这样处理的

c 实现jpeg中的ALI(可变长度整数转换)正反向转换_第2张图片

对比,两者就是少了0的处理。因为AC中的0已经被(a,b)对中的a处理了。

1.把DC转换为 二进制位数加二进制的中间格式

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include   
#include 
#include 
#include 
#include 

int main(void) {
	int i=-5;
	int o=-1;      //如果输出负数无意义
	char len=-1;   //如果输出负数无意义
	
	if(i==0){
		len=0;
	}
	if(i==-1){
		len=1;
		o=0;
	}
	if(i==1){
		len=1;
		o=1;
	}

	if((i>=2)&&(i<=32767)){             //二进制位数0-16位
		for(int a=0;a<16;a++){
			if((i>=pow(2,a))&&(i=-32767)&&(i<=-2)){
		for(int a=0;a<16;a++){
			if((i<=-pow(2,a))&&(i>-pow(2,(a+1)))){
				len=a+1;
				o=i+pow(2,(a+1))-1;
			}
		}
	}
	
	printf("len:%d  o:%d\n",len,o);

	return 0;
}

2. ALI逆向转换

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void) {
	int len = 4;
	int i = 7;
	int o;

	if (len == 0) {
		o = 0;
	}
	if ((len == 1) && (i == 0)) {
		o = -1;
	}
	if ((len == 1) && (i == 1)) {
		o = 1;
	}
	//--------------------------
	if ((i >= pow(2, len - 1)) && (i <= pow(2, len))) {
		o = i;
	}
	if ((i >= 0) && (i < pow(2, len - 1))) {
		o = i - pow(2, len) + 1;
	}


	printf("o:%d ", o);
	return 0;
}

你可能感兴趣的:(c语言,java,算法)