图像镜像
三个函数,垂直镜像、水平镜像、自定义镜像。
[cpp]
void CDIGTLSView::OnMirrorVertical() //垂直镜像
//程序编制:李立宗 lilizong@gmail.com
// 2012-8-6
{
if(myImage1.IsNull())
OnOpenResourceFile();
if(myImage2.IsNull()){
//myImage2.Destroy();
myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
}
COLORREF pixel;
int maxY = myImage1.GetHeight();
int maxX=myImage1.GetWidth();
int r,g,b,avg;
double c;
byte* pRealData;
byte* pRealData2;
pRealData=(byte*)myImage1.GetBits();
pRealData2=(byte*)myImage2.GetBits();
int pit=myImage1.GetPitch();
int pit2=myImage2.GetPitch();
//需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现
//CString str;
//str.Format(TEXT("%d"),pit2);
//MessageBox(str);
//str.Format(TEXT("%d"),pit2);
//MessageBox(str);
int bitCount=myImage1.GetBPP()/8;
int bitCount2=myImage2.GetBPP()/8;
//CString str;
//str.Format(TEXT("%d"),bitCount);
//MessageBox(str);
//str.Format(TEXT("%d"),bitCount2);
//MessageBox(str);
int newValue;
int tempR,tempG,tempB;
int key1,key2; //用来控制方向
//srand((unsigned)time(NULL));
//key1=rand()%100;
//key2=rand()%100;
//if(key1>50)
// key1=-1;
//else
// key1=1;
//if(key2<50)
// key2=1;
//else
// key2=-1;
//int xTrans=key1*rand()%(int)(maxX/1.5)+1;
//int yTrans=key2*rand()%(int)(maxY/1.5)+1;
//说明:将生产的图像作为24位图处理。
for (int y=0; y<maxY; y++) {
for (int x=0; x<maxX; x++) {
if((maxY-1-y>=0)&&(maxY-1-y<=maxY))
{ tempR=(int)(int)(*(pRealData+pit*(maxY-1-y)+x*bitCount));
if(bitCount==1)
{tempG=tempR;
tempB=tempR;}
else
{
tempG=(int)(int)(*(pRealData+pit*(maxY-1-y)+x*bitCount+1));
tempB=(int)(int)(*(pRealData+pit*(maxY-1-y)+x*bitCount+2));
}
}
else
{
tempR=255;
tempG=0;
tempB=0;
}
*(pRealData2+pit2*y+x*bitCount2)=tempR;
*(pRealData2+pit2*y+x*bitCount2+1)=tempG;
*(pRealData2+pit2*y+x*bitCount2+2)=tempB;
}
}
Invalidate();
}
void CDIGTLSView::OnMirrorHorizental() //水平镜像
{
if(myImage1.IsNull())
OnOpenResourceFile();
if(myImage2.IsNull()){
//myImage2.Destroy();
myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
}
补充:软件开发 , C++ ,