刚进贴吧菜鸟一个,求大神帮我看看这两个函数(两个方法)问题?
mfc吧
全部回复
仅看楼主
level 4
目标是实现两张大小和像素深度相同的图片之间的转换,中间有一个渐变的过程,采用的方法是计算连个张图片对应像素的差值,然后递加上去,逐渐从第一张图片过渡到目的图片。方法一(run)和方法二(run2)定义了三个CImage类(源图片src,目标图片des,和用于过渡的中间图片mid),方法一时用指针直接对内存操作,方法二是调用函数,对对象的像素操作。函数代码在下面。但是现在的问题就是运行时图片转换到一半就转换不过去了,停留在中间图片(mid中有两张图片的影子),多次检查还是无果,就来贴吧问问各位大神了。MFC菜鸟一只,求指导[乖]
//方法一:
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
level 1
你的算法好像有误, 使用半透明算法轻松搞定
2014年10月27日 06点10分 2
算法的哪里有误呢?请大神明示,第一个算法检查了很久,做了很多转换变形,结果代码变得好像很复杂的样子,都不行,
2014年10月29日 05点10分
半透明算法, 2张图合并为一张图
2014年10月29日 07点10分
level 1
再说你使用系统的UI函数来缩放图像会有上图中的红点的
2014年10月27日 06点10分 3
level 12
你的算法好像有误, 使用半透明算法轻松搞定
2014年10月29日 09点10分 4
1