📄 dibapi.cpp
字号:
if(bX1>0)
{
//线性变换
bMap[i]=(BYTE)bY1*i/bX1;
}
else
{
//直接附值为0
bMap[i]=0;
}
}
for(;i<bX2;i++)
{
//判断bX1是否等于bX2
if(bX2!=bX1)
{
//线性变换
bMap[i]=bY1+(BYTE)((bY2-bY1)*(i-bX1)/(bX2-bX1));
}
else
{
//直接附值为bY1
bMap[i]=bY1;
}
}
for(;i<256;i++)
{
//判断bX2是否等于255
if(bX2!=255)
{
//线性变换
bMap[i]=bY2+(BYTE)((255-bY2)*(i-bX2)/(255-bX2));
}
else
{
//直接附值为255
bMap[i]=255;
}
}
//每行
for(i=0;i<lHeight;i++)
{
//每列
for(j=0;j<lWidth;j++)
{
//指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
//计算新的灰度值
*lpSrc = bMap[*lpSrc];
}
}
//返回
return TRUE;
}
/************************************************************
*
*函数名称:
* InteEqualize()
*
*参数:
*
* LPSTR lpDIBBits -指向原DIB图象指针
* LONG lWidth -原图象宽度(象素数)
* LONG lHeight -原图象高度(象素数)
* 返回值:
* BOOL -成功返回TRUE,否则返回FALSE
*
*说明:
* 该函数用来对图象进行直方图均衡
***************************************************************/
BOOL WINAPI InteEqualize(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
//指向原图象的指针
unsigned char* lpSrc;
//临时变量
LONG lTemp;
//循环变量
LONG i;
LONG j;
//灰度映射表
BYTE bMap[256];
//图象每行的字节数
LONG lCount[256];
//图象每行的字节数
LONG lLineBytes ;
//计算图象每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8);
//重置记数为0
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*i+j;
//记数加1
lCount[*(lpSrc)]++;
}
}
for(i=0;i<256;i++)
{
//初始为0
lTemp=0;
for(j=0;j<=i;j++)
{
lTemp+=lCount[j];
}
//计算对应的新灰度值
bMap[i]=(BYTE)(lTemp * 255/lHeight/lWidth);
}
//每行
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
//指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
//计算新的灰度值
*lpSrc = bMap[*lpSrc];
}
}
return TRUE;
}
/*================================================================
*函数名称:混沌猫映射
* ArnoldZ()
*
*参数:
*
* LPSTR lpDIBBits -指向原DIB图象指针
* LONG lWidth -原图象宽度(象素数)
* LONG lHeight -原图象高度(象素数)
*
* 返回值:
* BOOL -成功返回TRUE,否则返回FALSE
*
*说明:
* 该函数用来对图象进行混沌加密
*
=================================================================*/
//暂时还没有写好猫映射
//这一部分还需要修改 2008-10-03
BOOL WINAPI Arnold(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,int para1,int para2,int sign)
{
//指向原图的指针
// unsigned char* lpSrc1,* lpSrc2;
unsigned char* lpSrc,* lpSrc1;
// unsigned char* ;
LONG i;
LONG j;
LONG x;
LONG y;
//图象每行的字节数
LONG lLineBytes;
//计算图象每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8);
if (sign==1)
{ for(i=0;i<lHeight;i++)
{
//每列
for(j=0;j<lWidth;j++)
{
x=(i+j)%lHeight;
y=(i+2*j)%lHeight;
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
lpSrc1=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-x)+y);
*lpSrc1=(unsigned char)((int)(*lpSrc));
/* x=(i+para1*j)%lWidth+1;
y=(para2*i+(para1*para2+1)*j)%lWidth+1;
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc1= (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
lpSrc2= (unsigned char*)lpDIBBits+lLineBytes*x+y;
*lpSrc2=(unsigned char)((int)(*lpSrc1));*/
}
}
}
else
{ for(i=0;i<lHeight;i++)
{//每列
for(j=0;j<lWidth;j++)
{
x=(i+j)%lHeight;
y=(i+2*j)%lHeight;
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
lpSrc1=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-x)+y);
*lpSrc=(unsigned char)((int)(*lpSrc1));
}
}
}
return TRUE;
}
/************************************************************
*
*函数名称:
* ChaosEncode()
*
*参数:
*
* LPSTR lpDIBBits -指向原DIB图象指针
* LONG lWidth -原图象宽度(象素数)
* LONG lHeight -原图象高度(象素数)
*
* 返回值:
* BOOL -成功返回TRUE,否则返回FALSE
*
*说明:
* 该函数用来对图象进行混沌加密
***************************************************************/
//yuhuan 2008-10-01 关键是这一部分程序
BOOL WINAPI ChaosEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double Xstart,double a)
{
//指向原图的指针
unsigned char* lpSrc;
//保存的混沌密码序列
DWORD chaos,k;
double x,y;
x=Xstart;
//循环变量
LONG i;
LONG j;
LONG h=1000;
LONG w;
//图象每行的字节数
LONG lLineBytes;
//中间变量
//FLOAT fTemp;
//计算图象每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8);
/**************************************************************
*本软件采用的是Logistic混沌系统,其定义为:y=a*x*(1-x);y又作为新的x
*继续生成序列,当3.5699456……<a<=4;-1<x<1,该系统为混沌系统
**************************************************************/
//产生1000个Logistic序列
/* for(w=0;w<1000;w++)
{
y=a*x*(1-x);
x=y;
}*/
//循环次数
//for(h=0;h<100;h++)
//{
//while(h>0)
//{
//每行
for(i=0;i<lHeight;i++)
{
//每列
for(j=0;j<lWidth;j++)
{
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
chaos=0;
for(w=0;w<8;w++)
{ //转换为二进制
y=a*x*(1-x);
if(y >= 0.4)
{
k=1;
}
else
{
k=0;
}
chaos=((chaos<<1)|k); //或运算|
// if(chaos>(int)256*y)
//chaos=256-chaos;
x=y;
//可以做个数组,进行
}
//修改位图像素值的位
*lpSrc=(unsigned char)((int)(*lpSrc)^(int)(chaos));//异或运算^
//对二进制位进行编码
//*lpSrc=255;
//chaos = ::LogisticCode(x,a);
//AfxMessageBox(chaos);
//fTemp = *lpSrc;
//判断是否超出范围
/*if(fTemp >255)
{
//直接附值为255
*lpSrc = 255;
}
else if (fTemp<0)
{
//直接赋值为0
*lpSrc = 0;
}
else
{
//四舍五入
*lpSrc = (unsigned char)(fTemp+0.5);
}*/
h--;
}
}
//}
//返回
return TRUE;
}
/************************************************************
*
*函数名称:三维Lorenz混沌加密系统
* LorenzEncode()
*
*参数:
*
* LPSTR lpDIBBits -指向原DIB图象指针
* LONG lWidth -原图象宽度(象素数)
* LONG lHeight -原图象高度(象素数)
*
* 返回值:
* BOOL -成功返回TRUE,否则返回FALSE
*
*说明:
* 该函数用来对图象进行混沌加密
***************************************************************/
//yuhuan 2008-10-03 关键是这一部分程序
BOOL WINAPI LorenzEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double x_lorenz,double y_lorenz,double z_lorenz,int k)
{
//指向原图的指针
unsigned char* lpSrc;
//保存的混沌密码序列
double x,y,z;
x=x_lorenz;
y=y_lorenz;
z=z_lorenz;
//循环变量
LONG i;
LONG j;
//2008-10-03
//这个地方要做修改,使得能够根据图片的大小加密图像
LONG bb[65539];
//图象每行的字节数
LONG lLineBytes;
//中间变量
//FLOAT fTemp;
//计算图象每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8);
for(i=1;i<=21846;i++)
{
Lorenz_3D(&x,&y,&z);
bb[3*(i-1)+1]=(int)((x*100000.0-(int)(x*100000.0))*1000.0);
bb[3*(i-1)+2]=(int)((y*100000.0-(int)(y*100000.0))*1000.0);
bb[3*(i-1)+3]=(int)((z*100000.0-(int)(z*100000.0))*1000.0);
}
for(i=0;i<lHeight;i++)
{
//每列
for(j=0;j<lWidth;j++)
{
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
//k为判断变量,当为1时加密,为0时解密,从VIEW类中传输过来的
if (k==1)
{*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999.0*256.0))%256);
}
else
{
*lpSrc=(unsigned char)(((int)(*lpSrc)+256-(int)(bb[i*lHeight+j]/999.0*256.0))%256);
}
//*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999*256))%256);//异或运算^
}
}
//}
//返回
return TRUE;
}
void WINAPI Lorenz_3D(double *xi,double *yi,double *zi)
{
double xo,yo,h,w;
h=0.001;
w=8/3;
xo=(*xi)+h*10.0*((*yi)-(*xi));
yo=(*yi)+h*(-(*xi)*(*zi)+28.0*(*xi)-(*yi));
*zi = *zi+h*((*xi)*(*yi)-w*(*zi));
*xi = xo;
*yi = yo;
}
/************************************************************************
*函数名:三维LIU混沌系统加密
*
*作者:yuhuan
*
*日期:2008-10-04
************************************************************************/
BOOL WINAPI LiuEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double x_liu,double y_liu,double z_liu,int sign_encode)
{
//指向原图的指针
unsigned char* lpSrc;
//保存的混沌密码序列
double x,y,z;
x=x_liu;
y=y_liu;
z=z_liu;
//循环变量
LONG i;
LONG j;
//2008-10-03
//这个地方要做修改,使得能够根据图片的大小加密图像
LONG bb[65539];
//图象每行的字节数
LONG lLineBytes;
//中间变量
//FLOAT fTemp;
//计算图象每行的字节数
lLineBytes = WIDTHBYTES(lWidth*8);
for(i=1;i<=21846;i++)
{
Liu_3D(&x,&y,&z);
bb[3*(i-1)+1]=(int)((x*100000.0-(int)(x*100000.0))*1000.0);
bb[3*(i-1)+2]=(int)((y*100000.0-(int)(y*100000.0))*1000.0);
bb[3*(i-1)+3]=(int)((z*100000.0-(int)(z*100000.0))*1000.0);
}
for(i=0;i<lHeight;i++)
{
//每列
for(j=0;j<lWidth;j++)
{
//位图是从下向上扫描的
//指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
//k为判断变量,当为1时加密,为0时解密,从VIEW类中传输过来的
if (sign_encode==1)
{*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999.0*256.0))%256);
}
else
{
*lpSrc=(unsigned char)(((int)(*lpSrc)+256-(int)(bb[i*lHeight+j]/999.0*256.0))%256);
}
//*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999*256))%256);//异或运算^
}
}
//}
//返回
return TRUE;
}
//混沌序列生成函数
void WINAPI Liu_3D(double *xi,double *yi,double *zi)
{
double xo,yo,h,c;
h=0.001;
c=2.5;
xo=(*xi)+h*10.0*((*yi)-(*xi));
yo=(*yi)+h*(-(*xi)*(*zi)+40.0*(*xi));
*zi = *zi+h*4.0*((*xi)*(*xi)-c*(*zi));
*xi = xo;
*yi = yo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -