void CwglView::ImageMasaic (CImage *pImgm,int n)
{
struct IMAGEPARAMENT P;
int Dx,Dy,i,j,s,t;
BYTE *buf,*buf1;
GetImageParament(pImgm,&P);
Dx=P.nWidth/n*n;
Dy=P.nHeight/n*n;
for (j=0;j<Dy;j+=n)
{
buf=(BYTE*) pImgm->GetPixelAddress(0,j);
for (i=0;i<Dx;i+=n)
{
for (s=1;s<n;s++)
memcpy(&buf[(i+s)*P.nBytesPerPixel],&buf[i*P.nBytesPerPixel],P.nBytesPerPixel);
}
for (t=1;t<n;t++) {
buf1=(BYTE*) pImgm->GetPixelAddress(0,j+t);
memcpy(buf1,buf,P.nBytesPerLine);
}
}
}
void CwglView::OnImageMasxaic()
{
// TODO: 在此添加命令处理程序代码
ImageMasaic(&m_im,4);
}
其中m_im为CImage类,struct IMAGEPARAMENT P是关于图像参数据的一个自定义结构,GetImageParament()是关于图像参数的。编译没有问题,就是点击菜单项以后图像没有变化,不知道出了什么问题,帮忙看看啊!
{
struct IMAGEPARAMENT P;
int Dx,Dy,i,j,s,t;
BYTE *buf,*buf1;
GetImageParament(pImgm,&P);
Dx=P.nWidth/n*n;
Dy=P.nHeight/n*n;
for (j=0;j<Dy;j+=n)
{
buf=(BYTE*) pImgm->GetPixelAddress(0,j);
for (i=0;i<Dx;i+=n)
{
for (s=1;s<n;s++)
memcpy(&buf[(i+s)*P.nBytesPerPixel],&buf[i*P.nBytesPerPixel],P.nBytesPerPixel);
}
for (t=1;t<n;t++) {
buf1=(BYTE*) pImgm->GetPixelAddress(0,j+t);
memcpy(buf1,buf,P.nBytesPerLine);
}
}
}
void CwglView::OnImageMasxaic()
{
// TODO: 在此添加命令处理程序代码
ImageMasaic(&m_im,4);
}
其中m_im为CImage类,struct IMAGEPARAMENT P是关于图像参数据的一个自定义结构,GetImageParament()是关于图像参数的。编译没有问题,就是点击菜单项以后图像没有变化,不知道出了什么问题,帮忙看看啊!
void CDynSplitView2::OnMasaike()
{
//刷新屏幕
CDC *pDC=GetDC();
CRect rect(0,0,1000,1000);
CBrush brush(RGB(255,255,255));
pDC->FillRect(&rect,&brush);
//复制图像数据
clearmem();
CDSplitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long mx=0;
long my=0;
int nscanline=8; //设置显示定位量
int k=0;
if(!pDoc ->statedoc&&state2==1)
{
BYTE* pBitmapData = CDibNew1->GetData();
LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
int bitmapHeight = CDibNew1->GetHeight();
// int bitmapWidth = CDibNew1->GetWidth();
int bitmapWidth = CDibNew1->GetDibWidthBytes();
int nrw=0;
int nrh=0;
if((bitmapWidth%12)!=0)nrw=1;
if((bitmapHeight%12)!=0)nrh=1;
long ltilenum=(bitmapWidth/12+nrw)*(bitmapHeight/12+nrh);
POINT* point=new POINT[ltilenum];
POINT* point1=new POINT[ltilenum]; if (CDibNew1->GetRGB()) // Has a color table
{
CPalette * hPalette1=CreateBitmapPalette(CDibNew1);
CPalette * hOldPalette =
pDC->SelectPalette(hPalette1, true);
pDC->RealizePalette();
for(int mi=0;mi<ltilenum;mi++)
{
point[mi].x=mx;
point[mi].y=my;
mx=mx+12;
if(mx>bitmapWidth)
{mx=0;my=my+12;}
}
for(int i=0;i<=2;i++)
for(mi=ltilenum-1;mi>0;mi--)
{
int n=(int)((double)ltilenum*rand()/RAND_MAX);
mx=point[n].x;my=point[n].y;
::StretchDIBits(pDC->GetSafeHdc(),mx, my, 12,12,
mx,bitmapHeight-my-12, 12,12,
pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
point[n].x=point[mi].x;
point[n].y=point[mi].y;
Sleep(1);
}
pDC->SelectPalette(hOldPalette, true);
::DeleteObject(hPalette1);
delete point;
}
else
{
for(int mi=0;mi<ltilenum;mi++)
{
point[mi].x=mx;
point[mi].y=my; mx=mx+12;
if(mx>bitmapWidth)
{mx=0;my=my+12;}
}
CString str , temp;
// for(int i=0;i<1;i++)
{
str = "" ;
int i, random;
bool * check = new bool [ltilenum ] ;
int * index = new int [ltilenum ] ;
//zero all values in the check array--this will keep track of #'s we've used
for(i=0; i<ltilenum; ++i) check[i] = false;
int got_a_good_one = 0;
// int n ;
for(i=0; i < ltilenum ; ++i) // we will get a random number for each index value
{
while( got_a_good_one == 0) // loop until we get a non-used number
{
random = (int)((double)ltilenum*rand()/RAND_MAX); // gives us a number between 0 - 51
if(check[random] == false)
{
index[i] = random; // set the indexput random into index array
check[random] = true; // set check on--this number has been used
got_a_good_one = 1;
}
}
got_a_good_one = 0; // ready for next one
//}
// for(mi=ltilenum-1;mi>=0;mi--)
// {
// int n=(int)((double)ltilenum*rand()/RAND_MAX);
// int n=(int)(rand()/ltilenum);
temp.Format ( "数%d" , index[i] ) ;
str +=temp ;
mx=point[index[i]].x;my=point[index[i]].y;
// mx=point[i].x;my=point[i].y;
::StretchDIBits(pDC->GetSafeHdc(), mx, my, 12,12,
mx , bitmapHeight-my-12 , 12,12,
pBitmapData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
// point[index[i]].x=point[i].x;
// point[index[i]].y=point[i].y;
Sleep(1);
//this->MessageBox ( str ) ;
}
//this->MessageBox ( str ) ;
// Sleep(500);
delete [] index ;
delete [] check ;
}
delete point;
}
}
Invalidate();
}