⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageprocess.cpp

📁 CONAXCA的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

BYTE* CImageProcess::ImageRotate(BYTE* pDib,double alpha)
{  
   BYTE   *pDib1=0;
   int    i,j,x,y,ww,r,g,b;
   int    Yd,Dx,Dy,max,maxn;
   double centerx,centery,sintheta,costheta;
   double X1,Y1,X2,Y2,theta,xx,yy,rr;
   BYTE   *sc,*p;
   BYTE   **list;
   CDIB   *pdib1,*pdib;
   int    wid,hei,bits,bpl,bpp;
 
   if ((RotateFlag==1)||(pDib==NULL)) return(NULL);
   pdib = new CDIB(pDib);
   wid=pdib->GetWidth();		
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   bpl=pdib->GetBytesPerLine();
   bpp=pdib->GetBytesPerPixel();

   if (bits<8) {
      delete pdib;
	  return(0);
   }
 
   Dx=wid;			Dy=hei;
   sc=(BYTE*) malloc(2*bpl);
   list=(BYTE**)malloc(Dy*sizeof(char*));
   for (i=0;i<Dy;i++)  
	   list[i]=(BYTE*) pdib->DibAddress(0,hei-1)+(Dy-1-i)*bpl;
 
   centerx=Dx/2;    centery=Dy/2;
   rr=sqrt(centerx*centerx+centery*centery);
   theta=atan((double) centery/(double) centerx);
   X1=fabs(rr*cos(alpha+theta));
   Y1=fabs(rr*sin(alpha+theta));
   X2=fabs(rr*cos(alpha-theta));
   Y2=fabs(rr*sin(alpha-theta));
   if (X2>X1)  X1=X2;
   if (Y2>Y1)  Y1=Y2;
   ww=(int) (2*X1);
 
   pDib1=CreateDib(ww,(int) (2*Y1),bits);
   pdib1 = new CDIB(pDib1);

   if (bits==8) {
      max=maxn=0;
      for (i=0;i<256;i++) {
         pdib->getpalette(i,&r,&g,&b);
	     pdib1->setpalette(i,r,g,b);
	     if (r+g+b>max) {
            max=r+g+b;		maxn=i;
		 }
	  }
   }
   sintheta=sin(alpha);
   costheta=cos(alpha);

   for (j=(int)(centery-Y1),Yd=0;j<=centery+Y1;j++,Yd++) {
      if (bits==8)
	     memset(sc,maxn,ww);
	  else
		 memset(sc,220,ww*bpp);
	  for (i=(int)(centerx-X1),p=sc;i<=centerx+X1;i++,p+=bpp) {
         xx=centerx+costheta*(i-centerx)+sintheta*(j-centery);
         yy=centery-sintheta*(i-centerx)+costheta*(j-centery);
         x=(int) xx;     y=(int) yy;
         if ((x>=0)&&(x<Dx)&&(y>=0)&&(y<Dy)) {
 			memcpy(p,&list[y][bpp*x],bpp);
		 }
	  }
      pdib1->setimage(0,Yd,ww,1,sc);
   }

   delete pdib1;
   free(list);
   free(sc);
   delete pdib;
   RotateFlag=1;
   return(pDib1);
}

void CImageProcess::Rotate15(void) 
{
   BYTE  *p;

   p=m_pDib;
   m_pDib=ImageRotate(m_pDib,3.14159/12);
   if (m_pDib==NULL) m_pDib=p;
   else if (p!=NULL) delete [] p;
}

void CImageProcess::Rotate30(void) 
{
   BYTE  *p;

   p=m_pDib;
   m_pDib=ImageRotate(m_pDib,3.14159/6);
   if (m_pDib==NULL) m_pDib=p;
   else if (p!=NULL) delete [] p;
}

void CImageProcess::Rotate45(void) 
{
   BYTE  *p;

   p=m_pDib;
   m_pDib=ImageRotate(m_pDib,3.14159/4);
   if (m_pDib==NULL) m_pDib=p;
   else if (p!=NULL) delete [] p;
}

void CImageProcess::Rotate60(void) 
{
   BYTE  *p;

   p=m_pDib;
   m_pDib=ImageRotate(m_pDib,3.14159/3);
   if (m_pDib==NULL) m_pDib=p;
   else if (p!=NULL) delete [] p;
}

void CImageProcess::Rotate75(void) 
{
   BYTE  *p;

   p=m_pDib;
   m_pDib=ImageRotate(m_pDib,3.14159*5/12);
   if (m_pDib==NULL) m_pDib=p;
   else if (p!=NULL) delete [] p;
}

void CImageProcess::Color(int n)
{
   int	x,y;
   int	i,r,g,b;
   int  wid,hei,bits,bpl,bpp,colors;
   CDIB *pdib,*pdib1;
   BYTE	*buf;
 
   if (m_pDib==NULL) return;

   pdib1= new CDIB(m_pDib1);
   pdib = new CDIB(m_pDib);
   wid=pdib1->GetWidth();		
   i  =pdib->GetWidth();		
   if (i != wid) {
      delete pdib;
      Refresh();
      pdib = new CDIB(m_pDib);
   }
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   bpl=pdib->GetBytesPerLine();
   bpp=pdib->GetBytesPerPixel();
   colors=pdib->GetColors();
   if (colors>(1<<bits)) colors=1<<bits;

   buf=(BYTE*) malloc(bpl);
   if (bits==24) {
  	  for(y=0;y<hei;y++) {
	     pdib1->getimage(0,y,wid,1,buf);
		 for (x=0;x<wid*bpp;x+=bpp) {
			switch(n) {
				case 0 :  buf[x+1]=buf[x+0]=0;	break;
				case 1 :  buf[x+0]=buf[x+2]=0;	break;
				case 2 :  buf[x+2]=buf[x+1]=0;	break;
				case 3 :  buf[x+0]=0;			break;
				case 4 :  buf[x+2]=0;			break;
				case 5 :  buf[x+1]=0;			break;
			}
		 }
		 pdib->setimage(0,y,wid,1,buf);
	  }
   }
   else if (bits<=8) {
	  for (i=0;i<colors;i++) {
		 pdib1->getpalette(i,&r,&g,&b);
         switch(n) {
			case 0 :  g=b=0;		break;
			case 1 :  b=r=0;		break;
			case 2 :  r=g=0;		break;
			case 3 :  b=0;			break;
			case 4 :  r=0;			break;
			case 5 :  g=0;			break;
		 }
		 pdib->setpalette(i,r,g,b);
	  }
   }
   free(buf);
   delete pdib;
   delete pdib1;
}

void CImageProcess::ZoomIn(int n) 
{
   int  i,j,k,r,g,b;
   BYTE *buf;
   CDIB *pdib1,*pdib2;
   int  wid,hei,bits,bpl,bpp,colors;
   
   if (m_pDib1==NULL) return;

   pdib1 = new CDIB(m_pDib1);
   wid=pdib1->GetWidth();		
   hei=pdib1->GetHeight();
   bits=pdib1->GetBitCount();
   bpl=pdib1->GetBytesPerLine();
   bpp=pdib1->GetBytesPerPixel();
   colors=pdib1->GetColors();

   if (bits<8) {
      delete pdib1;
	  return;
   }
 
   if(m_pDib!=NULL) {
      delete [] m_pDib;
      m_pDib=NULL;
   }
   m_pDib=CreateDib(wid*n,hei*n,bits);
   pdib2 = new CDIB(m_pDib);

   buf=(BYTE*) malloc(bpl*n);
   for (j=hei-1;j>=0;j--) {
      pdib1->getimage(0,j,wid,1,buf);
      for (i=bpp*(wid-1);i>=0;i-=bpp)
         for (k=0;k<n;k++)
            memcpy(&buf[n*i+bpp*k],&buf[i],bpp);
      for(k=0;k<n;k++)
         pdib2->setimage(0,j*n+k,wid*n,1,buf);
   }
   free(buf);

   if (bits<=8) {
	  for (i=0;i<colors;i++) {
         pdib1->getpalette(i,&r,&g,&b);
	     pdib2->setpalette(i,r,g,b);
	  }
   }
   delete pdib1;
   delete pdib2;
}

void CImageProcess::ZoomOut(int n) 
{
   int  i,j,r,g,b;
   BYTE *buf;
   CDIB *pdib1,*pdib2;
   int  wid,hei,bits,bpl,bpp,colors;
   
   if (m_pDib==NULL) return;

   pdib1 = new CDIB(m_pDib1);
   wid=pdib1->GetWidth();		
   hei=pdib1->GetHeight();
   bits=pdib1->GetBitCount();
   bpl=pdib1->GetBytesPerLine();
   bpp=pdib1->GetBytesPerPixel();
   colors=pdib1->GetColors();

   if (bits<8) {
      delete pdib1;
	  return;
   }
 
   if(m_pDib!=NULL) {
      delete [] m_pDib;
      m_pDib=NULL;
   }
   m_pDib=CreateDib(wid/n,hei/n,bits);
   pdib2 = new CDIB(m_pDib);

   buf=(BYTE*) malloc(bpl);
   for (j=0;j<hei;j+=n) {
      pdib1->getimage(0,j,wid,1,buf);
      for (i=0;i<bpp*wid;i+=n*bpp)
            memcpy(&buf[i/n],&buf[i],bpp);
      pdib2->setimage(0,j/n,wid/n,1,buf);
   }
   free(buf);

   if (bits<=8) {
	  for (i=0;i<colors;i++) {
         pdib1->getpalette(i,&r,&g,&b);
	     pdib2->setpalette(i,r,g,b);
	  }
   }
   delete pdib1;
   delete pdib2;
}

void CImageProcess::Scale(double alpha) 
{
   CDIB *pdib1,*pdib2;
   int  wid,hei,bits,bpl,bpp,colors;
   BYTE *buf1,*buf2,*sc;
   int  i,j,rr,gg,bb;
   int  Dx,Dy,x1,x2,xx,y1,y2=0,yy,flag;
   double a,b,c,d,t1,t2,t3;
   
   if (m_pDib1==NULL) return;

   pdib1 = new CDIB(m_pDib1);
   wid=pdib1->GetWidth();		
   hei=pdib1->GetHeight();
   bits=pdib1->GetBitCount();
   bpl=pdib1->GetBytesPerLine();
   bpp=pdib1->GetBytesPerPixel();
   colors=pdib1->GetColors();

   if (bits<8) {
      delete pdib1;
	  return;
   }
 
   if(m_pDib!=NULL) {
      delete [] m_pDib;
      m_pDib=NULL;
   }

   Dx=(int) (alpha*wid);
   Dy=(int) (alpha*hei);
   m_pDib=CreateDib(Dx,Dy,bits);
   pdib2 = new CDIB(m_pDib);

   if (bpp==1) {    // 256色图象
      flag=0;
      for (i=0;i<colors;i++) {
         pdib1->getpalette(i,&rr,&gg,&bb);
	     pdib2->setpalette(i,rr,gg,bb);
 	     if ((rr!=gg)||(rr!=bb)) flag=1;
      }
   }
   else flag=1;

   buf1=(BYTE*) malloc(bpl);
   buf2=(BYTE*) malloc(bpl);
   sc  =(BYTE*) malloc(Dx*bpp+4);
   for (j=0;j<Dy;j++) {
      yy=(int)(j/alpha);    y1=(int) yy;
      yy=yy-y1;
      if (y1 != y2) {
         pdib1->getimage(0,y1  ,wid,1,buf1);
         pdib1->getimage(0,y1+1,wid,1,buf2);
      }
      for (i=0;i<Dx;i++) {
	     xx=(int)(i/alpha);    x1=(int) xx;
	     x2=x1+1;       xx=xx-x1;
	     if (flag==1) {
	        if (xx>0.5) x1=x2;
            if (yy<0.5)
               memcpy(&sc[i*bpp],&buf1[x1*bpp],bpp);
            else
               memcpy(&sc[i*bpp],&buf2[x1*bpp],bpp);
		 }
	     else {
            a=buf1[x1];       b=buf2[x1];
            c=buf1[x1+1];	  d=buf2[x1+1];
            t1=a*(1-yy)+b*yy;   t2=c*(1-yy)+d*yy;
            t3=t1*(1-xx)+t2*xx;
            sc[i]=(BYTE) t3;
         }
      }
      pdib2->setimage(0,j,Dx,1,sc);
      y2=y1;
   }
   free(buf1);
   free(buf2);
   free(sc);

   delete pdib1;
   delete pdib2;
}

BOOL CImageProcess::PointInDib(int x,int y)
{
   CDIB  *pdib;
   BYTE  *p;

   pdib = new CDIB(m_pDib);
   p=pdib->DibAddress(x,y);
   delete pdib;

   if (p==0) return(FALSE);
   else      return(TRUE);
}

void CImageProcess::SetHWnd(HWND hWnd)
{
   hWndView=hWnd;
}

void CImageProcess::OkCapture(HWND hWnd)
{
#ifdef Capture
   long  size;

   if (CaptureFlag) {
      OkCap.OpenCard(hWnd,&Wid,&Hei);
      if (Wid>CaptureWidth)  Wid=CaptureWidth;
      if (Hei>CaptureHeight) Hei=CaptureHeight;
      OkCap.SetSize(hWnd,0,0,Wid,Hei);
   }
   else   return;

   if(m_pDib!=NULL) delete [] m_pDib;
   m_pDib=CreateDib(Wid,Hei,24);
   SetDibParam(m_pDib);

   OkCap.CaptToVideo(0);
   OkCap.VideoToDib(m_pBits,wid,hei,bits);

   if(m_pDib1!=NULL) delete [] m_pDib1;
   m_pDib1=CreateDib(wid,hei,bits);
   size=40L+colors*4+((31+wid*bits)/32*4)*hei;
   memcpy(m_pDib1,m_pDib,size);
#endif
}

void CImageProcess::SingleCapto(HWND hWnd)
{
#ifdef Capture
   long  size;

   if (CaptureFlag) {
      OkCap.SetSize(hWnd,0,0,CaptureWidth,CaptureHeight);
   }
   else   return;

   OkCap.CaptToBuffer(0);

   if(m_pDib!=NULL) delete [] m_pDib;
   m_pDib=CreateDib(CaptureWidth,CaptureHeight,24);
   SetDibParam(m_pDib);

   OkCap.BufferToDib(m_pBits,wid,hei,bits);

   if(m_pDib1!=NULL) delete [] m_pDib1;
   m_pDib1=CreateDib(wid,hei,bits);
   size=40L+colors*4+((31+wid*bits)/32*4)*hei;
   memcpy(m_pDib1,m_pDib,size);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -