level 4
无名指的小横按
楼主
目标是实现两张大小和像素深度相同的图片之间的转换,中间有一个渐变的过程,采用的方法是计算连个张图片对应像素的差值,然后递加上去,逐渐从第一张图片过渡到目的图片。方法一(run)和方法二(run2)定义了三个CImage类(源图片src,目标图片des,和用于过渡的中间图片mid),方法一时用指针直接对内存操作,方法二是调用函数,对对象的像素操作。函数代码在下面。但是现在的问题就是运行时图片转换到一半就转换不过去了,停留在中间图片(mid中有两张图片的影子),多次检查还是无果,就来贴吧问问各位大神了。MFC菜鸟一只,求指导![[乖]](/static/emoticons/u4e56.png)
//方法一:
void CaaaDlg::run(const CImage Src,const CImage Des){
GetClientRect(&rect);
CImage midPic; //中间对象,用于图像变换
int maxY = Src.GetHeight();
int maxX = Src.GetWidth();
midPic.Create(maxX,maxY,24,0);
midPic=Src;
byte* ptrDateSrc=(byte*)Src.GetBits(); //获取指向图像数据的指针
byte* ptrDateDes=(byte*)Des.GetBits();
byte* ptrDateMid=(byte*)midPic.GetBits();
int pitchSrc=Src.GetPitch(); //获取每行像素占用的字节
int pitchDes=Des.GetPitch();
int pitchMid=midPic.GetPitch();
int bitCountSrc=Src.GetBPP()/8; //获取每个像素占用的字节
int bitCountDes=Des.GetBPP()/8;
int bitCountMid=midPic.GetBPP()/8;
int k=0;
int R=*(ptrDateDes+pitchDes+bitCountDes)-*(ptrDateSrc+pitchSrc+bitCountSrc);
int R1=*(ptrDateMid+pitchMid+bitCountMid)-*(ptrDateDes+pitchDes+bitCountDes);
//获取每个两张图像上每个像素的RGB分量差值
while(k<piece){
for(int i=0;i<maxY;i++){
for(int j=0;j<maxX;j++){
float tempR=0.0;
float tempG=0.0;
float tempB=0.0;
int R1 =(int)*(ptrDateDes+pitchDes*i+bitCountDes*j);
int G1=(int)*(ptrDateDes+pitchDes*i+bitCountDes*j+1);
int B1=(int)*(ptrDateDes+pitchDes*i+bitCountDes*j+2);
int R2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j);
int G2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j+1);
int B2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j+2);
tempR=(float)(R1-R2)/piece;
tempG=(float)(G1-G2)/piece;
tempB=(float)(B1-B2)/piece;
if(abs(tempR-(int)tempR)>0.5&&tempR<0)
tempR=tempR-1;
if(abs(tempR-(int)tempR)>0.5&&tempR>0)
tempR=tempR+1;
if(abs(tempG-(int)tempG)>0.5&&tempG<0)
tempG=tempG-1;
if(abs(tempG-(int)tempG)>0.5&&tempG>0)
tempG=tempG+1;
if(abs(tempB-(int)tempG)>0.5&&tempB<0)
tempB=tempB-1;
if(abs(tempB-(int)tempB)>0.5&&tempB>0)
tempB=tempB+1;
//分量值递加到中间图片上面去
int Rmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j);
Rmid+=(int)(tempR);
int Gmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j+1);
Gmid+=(int)(tempG);
int Bmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j+2);
Bmid+=(int)(tempB);
*(ptrDateMid+pitchMid*i+bitCountMid*j)=(byte)Rmid;
*(ptrDateMid+pitchMid*i+bitCountMid*j+1)=(byte)Gmid;
*(ptrDateMid+pitchMid*i+bitCountMid*j+2)=(byte)Bmid;
}
}
midPic.Draw(GetDC()->m_hDC,0,0,rect.Width(),rect.Height()-50);
Sleep(100);
k++;
}
return;
}
//第二种方法转化图片
void CaaaDlg::run2(const CImage src,const CImage des){
GetClientRect(&rect);
int width=src.GetWidth(), height=src.GetHeight();
CImage mid;
mid.Create(width,height,24,0);
mid=src;
COLORREF pixelSrc,pixelMid,pixelDes;
int k=0;
while(k<piece){
for (int i=0;i<width;i++){
for(int j=0;j<height;j++){
pixelSrc=src.GetPixel(i,j);
pixelMid=mid.GetPixel(i,j);
pixelDes=des.GetPixel(i,j);
int rrSrc=GetRValue(pixelSrc),rrMid=GetRValue(pixelMid),rrDes=GetRValue(pixelDes);
int ggSrc=GetGValue(pixelSrc),ggMid=GetGValue(pixelMid),ggDes=GetGValue(pixelDes);
int bbSrc=GetBValue(pixelSrc),bbMid=GetBValue(pixelMid),bbDes=GetBValue(pixelDes);
int rrAdd=(int)((rrDes-rrSrc)/piece+0.5),
ggAdd=(int)((ggDes-ggSrc)/piece+0.5),
bbAdd=(int)((bbDes-bbSrc)/piece+0.5);
rrMid+=(byte)rrAdd,ggMid+=(byte)ggAdd,bbMid+=(byte)bbAdd;
pixelMid=RGB(rrMid,ggMid,bbMid);
mid.SetPixel(i,j,pixelMid);
}
}
mid.Draw(GetDC()->m_hDC,0,0,rect.Width(),rect.Height()-50);
Sleep(100);
k++;
}
}
左边是起始帧,右边是终止帧,

运行的结果

求指导
2014年10月24日 10点10分
1
//方法一:
void CaaaDlg::run(const CImage Src,const CImage Des){
GetClientRect(&rect);
CImage midPic; //中间对象,用于图像变换
int maxY = Src.GetHeight();
int maxX = Src.GetWidth();
midPic.Create(maxX,maxY,24,0);
midPic=Src;
byte* ptrDateSrc=(byte*)Src.GetBits(); //获取指向图像数据的指针
byte* ptrDateDes=(byte*)Des.GetBits();
byte* ptrDateMid=(byte*)midPic.GetBits();
int pitchSrc=Src.GetPitch(); //获取每行像素占用的字节
int pitchDes=Des.GetPitch();
int pitchMid=midPic.GetPitch();
int bitCountSrc=Src.GetBPP()/8; //获取每个像素占用的字节
int bitCountDes=Des.GetBPP()/8;
int bitCountMid=midPic.GetBPP()/8;
int k=0;
int R=*(ptrDateDes+pitchDes+bitCountDes)-*(ptrDateSrc+pitchSrc+bitCountSrc);
int R1=*(ptrDateMid+pitchMid+bitCountMid)-*(ptrDateDes+pitchDes+bitCountDes);
//获取每个两张图像上每个像素的RGB分量差值
while(k<piece){
for(int i=0;i<maxY;i++){
for(int j=0;j<maxX;j++){
float tempR=0.0;
float tempG=0.0;
float tempB=0.0;
int R1 =(int)*(ptrDateDes+pitchDes*i+bitCountDes*j);
int G1=(int)*(ptrDateDes+pitchDes*i+bitCountDes*j+1);
int B1=(int)*(ptrDateDes+pitchDes*i+bitCountDes*j+2);
int R2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j);
int G2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j+1);
int B2=(int)*(ptrDateSrc+pitchSrc*i+bitCountSrc*j+2);
tempR=(float)(R1-R2)/piece;
tempG=(float)(G1-G2)/piece;
tempB=(float)(B1-B2)/piece;
if(abs(tempR-(int)tempR)>0.5&&tempR<0)
tempR=tempR-1;
if(abs(tempR-(int)tempR)>0.5&&tempR>0)
tempR=tempR+1;
if(abs(tempG-(int)tempG)>0.5&&tempG<0)
tempG=tempG-1;
if(abs(tempG-(int)tempG)>0.5&&tempG>0)
tempG=tempG+1;
if(abs(tempB-(int)tempG)>0.5&&tempB<0)
tempB=tempB-1;
if(abs(tempB-(int)tempB)>0.5&&tempB>0)
tempB=tempB+1;
//分量值递加到中间图片上面去
int Rmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j);
Rmid+=(int)(tempR);
int Gmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j+1);
Gmid+=(int)(tempG);
int Bmid=(int)*(ptrDateMid+pitchMid*i+bitCountMid*j+2);
Bmid+=(int)(tempB);
*(ptrDateMid+pitchMid*i+bitCountMid*j)=(byte)Rmid;
*(ptrDateMid+pitchMid*i+bitCountMid*j+1)=(byte)Gmid;
*(ptrDateMid+pitchMid*i+bitCountMid*j+2)=(byte)Bmid;
}
}
midPic.Draw(GetDC()->m_hDC,0,0,rect.Width(),rect.Height()-50);
Sleep(100);
k++;
}
return;
}
//第二种方法转化图片
void CaaaDlg::run2(const CImage src,const CImage des){
GetClientRect(&rect);
int width=src.GetWidth(), height=src.GetHeight();
CImage mid;
mid.Create(width,height,24,0);
mid=src;
COLORREF pixelSrc,pixelMid,pixelDes;
int k=0;
while(k<piece){
for (int i=0;i<width;i++){
for(int j=0;j<height;j++){
pixelSrc=src.GetPixel(i,j);
pixelMid=mid.GetPixel(i,j);
pixelDes=des.GetPixel(i,j);
int rrSrc=GetRValue(pixelSrc),rrMid=GetRValue(pixelMid),rrDes=GetRValue(pixelDes);
int ggSrc=GetGValue(pixelSrc),ggMid=GetGValue(pixelMid),ggDes=GetGValue(pixelDes);
int bbSrc=GetBValue(pixelSrc),bbMid=GetBValue(pixelMid),bbDes=GetBValue(pixelDes);
int rrAdd=(int)((rrDes-rrSrc)/piece+0.5),
ggAdd=(int)((ggDes-ggSrc)/piece+0.5),
bbAdd=(int)((bbDes-bbSrc)/piece+0.5);
rrMid+=(byte)rrAdd,ggMid+=(byte)ggAdd,bbMid+=(byte)bbAdd;
pixelMid=RGB(rrMid,ggMid,bbMid);
mid.SetPixel(i,j,pixelMid);
}
}
mid.Draw(GetDC()->m_hDC,0,0,rect.Width(),rect.Height()-50);
Sleep(100);
k++;
}
}
左边是起始帧,右边是终止帧,

运行的结果
求指导