Пример #1
0
static inline void SetLum(float* r, float* g, float* b, float a, float l) {
    float d = l - Lum(*r, *g, *b);
    *r += d;
    *g += d;
    *b += d;
    clipColor(r, g, b, a);
}
Пример #2
0
static inline void clipColor(float* r, float* g, float* b, float a) {
    float L = Lum(*r, *g, *b);
    float n = min(*r, *g, *b);
    float x = max(*r, *g, *b);
    float denom;
    if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non zero
        float scale = L / denom;
        *r = L + (*r - L) * scale;
        *g = L + (*g - L) * scale;
        *b = L + (*b - L) * scale;
    }
    
    if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non zero
        float scale = (a - L) / denom;
        *r = L + (*r - L) * scale;
        *g = L + (*g - L) * scale;
        *b = L + (*b - L) * scale;
    }
}
Пример #3
0
static Sk4f saturation_4f(const Sk4f& s, const Sk4f& d) {
    float sa = s[SkPM4f::A];
    float sr = s[SkPM4f::R];
    float sg = s[SkPM4f::G];
    float sb = s[SkPM4f::B];
    
    float da = d[SkPM4f::A];
    float dr = d[SkPM4f::R];
    float dg = d[SkPM4f::G];
    float db = d[SkPM4f::B];
    
    float Dr = dr;
    float Dg = dg;
    float Db = db;
    SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da);
    SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa);
    
    return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
                       sa + da - sa * da);
}
Пример #4
0
static Sk4f hue_4f(const Sk4f& s, const Sk4f& d) {
    float sa = s[SkPM4f::A];
    float sr = s[SkPM4f::R];
    float sg = s[SkPM4f::G];
    float sb = s[SkPM4f::B];
    
    float da = d[SkPM4f::A];
    float dr = d[SkPM4f::R];
    float dg = d[SkPM4f::G];
    float db = d[SkPM4f::B];

    float Sr = sr;
    float Sg = sg;
    float Sb = sb;
    SetSat(&Sr, &Sg, &Sb, Sat(dr, dg, db) * sa);
    SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);

    return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb),
                       sa + da - sa * da);
}
Пример #5
0
static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) {
    float sa = s[SkPM4f::A];
    float sr = s[SkPM4f::R];
    float sg = s[SkPM4f::G];
    float sb = s[SkPM4f::B];
    
    float da = d[SkPM4f::A];
    float dr = d[SkPM4f::R];
    float dg = d[SkPM4f::G];
    float db = d[SkPM4f::B];
    
    float Dr = dr;
    float Dg = dg;
    float Db = db;
    SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da);
    
    Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
                           sa + da - sa * da);
    // Can return tiny negative values ...
    return Sk4f::Max(res, Sk4f(0));
}
Пример #6
0
static Sk4f color_4f(const Sk4f& s, const Sk4f& d) {
    float sa = s[SkPM4f::A];
    float sr = s[SkPM4f::R];
    float sg = s[SkPM4f::G];
    float sb = s[SkPM4f::B];
    
    float da = d[SkPM4f::A];
    float dr = d[SkPM4f::R];
    float dg = d[SkPM4f::G];
    float db = d[SkPM4f::B];

    float Sr = sr;
    float Sg = sg;
    float Sb = sb;
    SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
    
    Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb),
                           sa + da - sa * da);
    // Can return tiny negative values ...
    return Sk4f::Max(res, Sk4f(0));
}
Пример #7
0
int main( int argc, char **argv )  
{  
	bmpreader pict(argv[1]);//实例一个bmp读取类,获得相应的信息头和像素数据,并根据不同大小的像素位进行填充图像
	BYTE KeyInput[16];//输入的密钥,传送走的密钥
	double pk[16];//迭代前的各个盒子值
	double nk[16];//迭代后的各个盒子值
	int picH = pict.picH;
	int picW = pict.picW;//原始图的高宽
	int picS = pict.csize;//填充后的整体大小
	int bnum = pict.Bnum;//分块数
	int eachtime = picS/bnum;
	printf("each time = %d Num = %d\n",eachtime,bnum);
	//BYTE RL[eachtime];//每次的随机序列
	//RL 得变成double的了。。方便运算么
	cout<<"Please input a Keyline...(16byte-128bit)"<<endl;
	cout<<"1234567890123456<-Here the ending is.."<<endl;
	cin>>KeyInput;
	//获得x初始盒子,迭代times次,消除。。
	Xprod(KeyInput,pk);
	NKProd(pk,nk,500);
	//然后产生随机序列并映射到(-0.5,0.5)直接利用混沌盒子的值!?yes!!(8x4-8x2+1)~(-1,1)的,直接处理出来就好了
	BYTE BK[eachtime];
	double YUV[eachtime];
	double rla[eachtime];
	double rlb[eachtime];
	double L[eachtime];
	double R[eachtime];
	MatrixXd Lym(8,8);
	MatrixXd Rym(8,8);
	MatrixXd Lum(8,8);
	MatrixXd Rum(8,8);
	MatrixXd Lvm(8,8);
	MatrixXd Rvm(8,8);
	MatrixXd Xym(8,8);
	MatrixXd Xum(8,8);
	MatrixXd Xvm(8,8);
	MatrixXd Yym(8,8);
	MatrixXd Yum(8,8);
	MatrixXd Yvm(8,8);
	
	for(int k = 0 ; k < bnum ; k++){
		memcpy(BK,pict.PicS+k*eachtime,eachtime);
		//RGB to YUV
		RtoY(BK,YUV,eachtime);
		//一次产生a b 以计算出L & R
		rlProd(pk,nk,rla,eachtime);
		rlProd(pk,nk,rlb,eachtime);
		//L&R 
		LProd(rla,L);
		RProd(rlb,R);
		for(int i=0;i<8;i++){
		    for(int j=0;j<8;j++){
		    	Xym(i,j) = YUV[3*(8*i+j)+0];
			Xum(i,j) = YUV[3*(8*i+j)+1];
			Xvm(i,j) = YUV[3*(8*i+j)+2];
			Lym(i,j) = L[3*(8*i+j)+0];
			Lum(i,j) = L[3*(8*i+j)+1];
			Lvm(i,j) = L[3*(8*i+j)+2];
			Rym(i,j) = R[3*(8*i+j)+0];
			Rum(i,j) = R[3*(8*i+j)+1];
			Rvm(i,j) = R[3*(8*i+j)+2];

		    }
		}//得到YUV三个分量的X矩阵,3个L&R
		Yym = Lym*Xym*Rym;
		Yum = Lum*Xum*Rum;
		Yvm = Lvm*Xvm*Rvm;
		/*if(k%100 == 0){
		    	cout<<Lym<<endl<<Lum<<endl<<Lvm<<endl<<Rym<<endl<<Rum<<endl<<Rvm<<endl;
			cout<<k<<"::"<<endl<<"yym:"<<endl<<Yym<<endl<<"yum:"<<endl<<Yum<<endl<<"yvm:"<<endl<<Yvm<<endl;
		}*/

	}
	
	return 0;  
}