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); }
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; } }
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); }
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); }
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)); }
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)); }
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; }