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

📄 winimage.c

📁 本下载文件是《C/C++图像处理编程》一书的演示程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		 setimage(image,i    ,0,1,hei,buff2);
		 setimage(image,wid-1-i,0,1,hei,buff1);
	  }
   }
   if ((n&0x2)==2) {
	  for (i=0;i<hei/2;i++) {
		 getimage(image,0,i    ,wid,1,buff1);
		 getimage(image,0,hei-1-i,wid,1,buff2);
		 setimage(image,0,i    ,wid,1,buff2);
		 setimage(image,0,hei-1-i,wid,1,buff1);
	  }
   }
   free(buff1);
   free(buff2);
   WriteDDB(image,0,0,0,0,wid,hei);
   InvalidateRect(hwnd,NULL,FALSE);
}

void ImageBrowse(int x,int y)                            //  鼠标漫游与移动
{
   int  f=0;

   if ((175<x)&&(x<195)&&(wid-pic_x>195)) {
	   pic_x+=3;       f=1;
   }
   else if ((x<20)&&(wid>198)&&(wid-pic_x>0)) {
	   pic_x-=3;       f=1;
   }
   if ((260<y)&&(y<280)&&(hei-pic_y>280)) {
	   pic_y+=3;       f=1;
   }
   else if ((y<20)&&(hei>283)&&(hei-pic_y>0)) {
	   pic_y-=3;       f=1;
   }
   if (pic_x+195>wid)    pic_x=wid-195;
   if (pic_x<0) pic_x=0;
   if (pic_y+280>hei)    pic_y=hei-280;
   if (pic_y<0) pic_y=0;

   if (f==1) {
      WriteDDB(Image[0],  0,  0,pic_x,pic_y,195,270);
      WriteDDB(Image[1],200,  0,pic_x,pic_y,195,270);
      WriteDDB(Image[2],400,  0,pic_x,pic_y,195,270);
      WriteDDB(Image[3],600,  0,pic_x,pic_y,195,270);
      WriteDDB(Image[4],  0,275,pic_x,pic_y,195,270);
      WriteDDB(Image[5],200,275,pic_x,pic_y,195,270);
      WriteDDB(Image[6],400,275,pic_x,pic_y,195,270);
      WriteDDB(Image[7],600,275,pic_x,pic_y,195,270);
   }
   InvalidateRect(hwnd,NULL,FALSE);
}

void ColorToGray(int m,int n)                                            //  变灰阶
{
   BYTE *buff,*p,gray[256];
   int  i,j,k,r,g,b;

   if (Image[m]->hdib==NULL) return;
   ImageCreate(Image[n],wid,hei,8);

   buff=(BYTE*) malloc(Image[m]->bpl);
   for (i=0;i<256;i++) {
      setpalette(Image[n],i,i,i,i);
   }
   if (Image[m]->bitcount==8) {
      for (i=0;i<256;i++) {
         getpalette(Image[m],i,&r,&g,&b);
         gray[i]=(BYTE) ((30*r+59*g+11*b+50)/100);
	  }
  	  for (i=0;i<hei;i++) {
         getimage(Image[m],0,i,wid,1,buff);
	     for (j=0;j<wid;j++) {
            buff[j]=gray[buff[j]];
		 }
	     setimage(Image[n],0,i,wid,1,buff);
	  }
   }
   else if (Image[m]->bitcount==24) {
      p=buff;
	  for (i=0;i<hei;i++) {
 		 getimage(Image[m],0,i,wid,1,buff);
		 for (j=0,k=0;j<wid;j++,k+=3) {
            buff[j]=(BYTE) ((11*p[k]+59*p[k+1]+30*p[k+2]+50)/100);
		 }
         setimage(Image[n],0,i,wid,1,buff);
      }
   }
   free(buff);
}

void MultiPictureDisp(void)
{
   BYTE *buff,*buff1,pal[768];
   int  i,j,k,r,g,b;

   if (Image[0]->hdib==NULL) return;
   ImageCreate(Image[1],wid,hei,8);
   ImageCreate(Image[2],wid,hei,8);
   ImageCreate(Image[3],wid,hei,8);
 
   buff=(BYTE*)  malloc(image->bpl);
   buff1=(BYTE*) malloc(image->bpl);
   if (image->bitcount==24) {
      for (i=0;i<hei;i++) {
         getimage(image,0,i,wid,1,buff);
         for (j=0,k=0;j<wid;j++,k+=3)  buff1[j]=buff[k+2];
         setimage(Image[1],0,i,wid,1,buff1);
         for (j=0,k=0;j<wid;j++,k+=3)  buff1[j]=buff[k+1];
         setimage(Image[2],0,i,wid,1,buff1);
         for (j=0,k=0;j<wid;j++,k+=3)  buff1[j]=buff[k];
         setimage(Image[3],0,i,wid,1,buff1);
	  }
   }
   else if (image->bitcount==8) {
	  for (i=0,j=0;i<256;i++) {
 	     getpalette(image,i,&r,&g,&b);
         pal[j++]=(BYTE) r;
         pal[j++]=(BYTE) g;
         pal[j++]=(BYTE) b;
	  }
  	  for (i=0;i<hei;i++) {
         getimage(image,0,i,wid,1,buff);
 	     for (j=0;j<wid;j++)  buff1[j]=pal[3*buff[j]];
 	     setimage(Image[1],0,i,wid,1,buff1);
 	     for (j=0;j<wid;j++)  buff1[j]=pal[3*buff[j]+1];
 	     setimage(Image[2],0,i,wid,1,buff1);
 	     for (j=0;j<wid;j++)  buff1[j]=pal[3*buff[j]+2];
 	     setimage(Image[3],0,i,wid,1,buff1);
	  }
   }
   free(buff);
   free(buff1);

   for (i=0;i<256;i++) {
      setpalette(Image[1],i,i,0,0);
      setpalette(Image[2],i,0,i,0);
      setpalette(Image[3],i,0,0,i);
   }
   ClearDDB();
   WriteDDB(Image[0],  0,0,0,0,195,270);
   WriteDDB(Image[1],200,0,0,0,195,270);
   WriteDDB(Image[2],400,0,0,0,195,270);
   WriteDDB(Image[3],600,0,0,0,195,270);

   ColorToGray(0,4);
   ImageCopy(1,5);
   ImageCopy(2,6);
   ImageCopy(3,7);
   for (i=0;i<256;i++) {
      setpalette(Image[5],i,i,i,i);
      setpalette(Image[6],i,i,i,i);
      setpalette(Image[7],i,i,i,i);
   }
   WriteDDB(Image[4],  0,275,0,0,195,270);
   WriteDDB(Image[5],200,275,0,0,195,270);
   WriteDDB(Image[6],400,275,0,0,195,270);
   WriteDDB(Image[7],600,275,0,0,195,270);

   hMemDC=CreateMemDC();
   TextOut(hMemDC, 10, 10,"彩色图像",8);
   TextOut(hMemDC,210, 10,"红分量(彩色)",12);
   TextOut(hMemDC,410, 10,"绿分量(彩色)",12);
   TextOut(hMemDC,610, 10,"蓝分量(彩色)",12);
   TextOut(hMemDC, 10,285,"灰阶图像",8);
   TextOut(hMemDC,210,285,"红分量(灰阶)",12);
   TextOut(hMemDC,410,285,"绿分量(灰阶)",12);
   TextOut(hMemDC,610,285,"蓝分量(灰阶)",12);
   DeleteMemDC(hMemDC);
   InvalidateRect(hwnd,NULL,FALSE);
}

int  LButtonDown(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
   int      k,r,g,b,cur_x,cur_y,xs;
   char     StringT[20];
   DWORD	color;
   COLORREF	clrref;

   if (image->hdib==NULL) return 0;
   cur_x=LOWORD(lParam);	cur_y=HIWORD(lParam);
   if (T_flag!=IDM_WINCAPT) {
      if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
         return 0;
   }

   if (T_flag==IDM_POINT) {                   //  单点数据处理
      xs=850;
	  color=getpixel(Image[0],cur_x,cur_y);
      if (Image[0]->bitcount==8) {
         getpalette(Image[0],(int)color,&r,&g,&b);
         clrref=RGB(r,g,b);
	  }
	  else {
	     clrref=DWORD2CLRREF(color);
	     r=(color>>16)&0xff;		g=(color>>8)&0xff;
		 b=color&0xff;
	  }

	  FillDdbWin(xs,45,60,60,RGB(0,0,0),clrref);
 	  FillDdbWin(xs,120,80,180,RGB(255,255,255),RGB(255,255,255));
      hMemDC=CreateMemDC();
      if ((r==g)&&(r==b)) {
         sprintf(StringT,"g   %d",r);
 	     TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
	  }
	  else {
         sprintf(StringT,"r   %d",r);
 	     TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
         sprintf(StringT,"g  %d",g);
 	     TextOut(hMemDC,xs+10,140,StringT,strlen(StringT));
         sprintf(StringT,"b  %d",b);
 	     TextOut(hMemDC,xs+10,160,StringT,strlen(StringT));
         k=(30*r+59*g+11*b)/100;
         sprintf(StringT,"k  %d",k);
 	     TextOut(hMemDC,xs+10,180,StringT,strlen(StringT));
	  }
      sprintf(StringT,"x  %d",cur_x);
 	  TextOut(hMemDC,xs+10,210,StringT,strlen(StringT));
      sprintf(StringT,"y  %d",cur_y);
 	  TextOut(hMemDC,xs+10,230,StringT,strlen(StringT));
      DeleteMemDC(hMemDC);
   }
   else if ((T_flag==IDM_LINE)&&(pxy_n==0)){               //  线段数据处理
      pxy[0].x=cur_x;	pxy[0].y=cur_y;
 	  pxy_n=1;          pxy_f=0;
 	  DrawLine(cur_x-3,cur_y  ,cur_x+3,cur_y  ,color_tab[2]);
      DrawLine(cur_x  ,cur_y-3,cur_x  ,cur_y+3,color_tab[2]);
   }
   else if ((T_flag==IDM_WINCAPT)&&(pxy_n==0)) {     //  截取屏幕窗口
      pxy[0].x=cur_x;      pxy[0].y=cur_y;
  	  pxy_n=1;
  	  return 0;
   }
   InvalidateRect(hWnd,NULL,FALSE);
   return 0;
}

int  MouseMove(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
   int      i,j,k,r,g,b,cur_x,cur_y,x,y,xs;
   char     StringT[20];
   DWORD	color;
   COLORREF	clrref;

   if (image->hdib==NULL) return 0;
   cur_x=LOWORD(lParam);	cur_y=HIWORD(lParam);
   if (T_flag!=IDM_WINCAPT) {
      if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
         return 0;
   }

   if (T_flag==IDM_POINT) {                   //  单点数据动态
      xs=700;
	  color=getpixel(Image[0],cur_x,cur_y);
      if (Image[0]->bitcount==8) {
         getpalette(Image[0],(int)color,&r,&g,&b);
		 clrref=RGB(r,g,b);
	  }
	  else {
	     clrref=DWORD2CLRREF(color);
	     r=(color>>16)&0xff;		g=(color>>8)&0xff;
		 b=color&0xff;
	  }
 	  FillDdbWin(xs,45,60,60,RGB(0,0,0),clrref);
 	  FillDdbWin(xs,120,80,180,RGB(255,255,255),RGB(255,255,255));
      hMemDC=CreateMemDC();
      if ((r==g)&&(r==b)) {
         sprintf(StringT,"g   %d",r);
 		 TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
	  }
	  else {
         sprintf(StringT,"r   %d",r);
 		 TextOut(hMemDC,xs+10,120,StringT,strlen(StringT));
         sprintf(StringT,"g  %d",g);
 		 TextOut(hMemDC,xs+10,140,StringT,strlen(StringT));
         sprintf(StringT,"b  %d",b);
 		 TextOut(hMemDC,xs+10,160,StringT,strlen(StringT));
         k=(30*r+59*g+11*b)/100;
         sprintf(StringT,"k  %d",k);
 		 TextOut(hMemDC,xs+10,180,StringT,strlen(StringT));
	  }
      sprintf(StringT,"x  %d",cur_x);
 	  TextOut(hMemDC,xs+10,210,StringT,strlen(StringT));
      sprintf(StringT,"y  %d",cur_y);
 	  TextOut(hMemDC,xs+10,230,StringT,strlen(StringT));
      DeleteMemDC(hMemDC);
   }
   else if ((T_flag==IDM_LINE)&&(pxy_n==1)) {//线段数据动态
      if (pxy_f==1) {
          LineData(1,1);
         for (k=0;k<pxy_n;k++) {
		    i=pxy[k].x;		j=pxy[k].y;
		    DrawLine(i-3,j,i+3,j,color_tab[2]);
		    DrawLine(i,j-3,i,j+3,color_tab[2]);
		 }
	  }
 	  pxy[1].x=cur_x;	pxy[1].y=cur_y;
      LineData(1,0);
      DrawLine(pxy[0].x,pxy[0].y,cur_x,cur_y,color_tab[2]);
   }
   else if (T_flag==IDM_WINCAPT) {         //  截取屏幕窗口
      if (pxy_f==1) {
         for (k=1;k<pxy_n;k++) {
 		    LineData(k,1);
		 }
	  }
	  if (pxy_n>0) {
         x=pxy[0].x;		y=pxy[0].y;
		 if ((x==cur_x)||(y==cur_y)) return(0);
		 pxy[1].x=cur_x;	pxy[1].y=y;
		 pxy[2].x=cur_x;	pxy[2].y=cur_y;
		 pxy[3].x=x;		pxy[3].y=cur_y;
		 pxy[4].x=x;		pxy[4].y=y;
		 pxy_n=5;
         for (i=1;i<5;i++) {
            LineData(i,0);
		 }

         clrref=RGB(0,255,0);
         for (i=0;i<4;i++) {
            DrawLine(pxy[i].x,pxy[i].y,pxy[i+1].x,pxy[i+1].y,clrref);
		 }
	  }
   }
   else if (T_flag==IDM_IMAGEBROWSE) {
	  if ((cur_x<min(196,wid))&&(cur_y<min(271,hei))) 
         ImageBrowse(cur_x,cur_y);          //  图像的同步漫游
   }
   pxy_f=1;
   InvalidateRect(hWnd,NULL,FALSE);
   return 0L;
}

int  LButtonUp(HWND hWnd,WORD message,WORD wParam,LONG lParam)
{
   int      i,j,k,cur_x,cur_y,t,xs;
   int      r,g,b;
   DWORD	color;
   COLORREF	clrref;
   int      x0,y0,x1,y1,m,n,dx,dy;
   struct DOT *dot;

   if (image->hdib==NULL) return 0;
   cur_x=LOWORD(lParam);	cur_y=HIWORD(lParam);
   if (T_flag!=IDM_WINCAPT) {
      if ((cur_x+cur_y==0)||(cur_x>=wid)||(cur_y>=hei))
	     return 0;
   }

   if ((T_flag==IDM_LINE)&&(pxy_n==1)) {  //  线段数据处理
	  DrawLine(pxy[0].x,pxy[0].y,cur_x,cur_y,color_tab[2]);
      pxy[1].x=cur_x;		pxy[1].y=cur_y;
 	  DrawLine(cur_x-3,cur_y,cur_x+3,cur_y,color_tab[2]);
	  DrawLine(cur_x,cur_y-3,cur_x,cur_y+3,color_tab[2]);
	  DrawLine(pxy[0].x-3,pxy[0].y,pxy[0].x+3,pxy[0].y,color_tab[0]);
	  DrawLine(pxy[0].x,pxy[0].y-3,pxy[0].x,pxy[0].y+3,color_tab[0]);
      x0=pxy[0].x;		y0=pxy[0].y;
      x1=pxy[1].x;		y1=pxy[1].y;
      dx=abs(x1-x0);	dy=abs(y1-y0);
      dot=(struct DOT *) malloc(sizeof(struct DOT)*(dx+dy+2));
      j=LineCoor(x0,y0,x1,y1,dot);
      if (j>256) {
	     for (i=0;i<j;i++) {
            k=(int) ((256.0*i+0.5)/j);
		    dot[k].x=dot[i].x; 	  dot[k].y=dot[i].y;
		 }
		 j=256;
	  }
      xs=750;
      if (image->bitcount==8) {
         n=300;
 	     FillDdbWin(xs-19,n-256,15,258,RGB(0,0,0),RGB(255,255,255));
         for (i=0;i<256;i++) {
            getpalette(Image[0],i,&r,&g,&b);
	        clrref=RGB(r,g,b);
          DrawLine(xs-18,n-i,xs-6,n-i,clrref);
		 }

         FillDdbWin(xs,n-256,260,260,0x00ffffff,0x00ffffff);
         DrawLine(xs,n-256,xs+256,n-256,color_tab[7]);
         DrawLine(xs,n,xs+256,n,color_tab[7]);
         clrref=RGB(255,0,0);
         t=getpixel(Image[0],dot[0].x,dot[0].y);
         for (i=1;i<j && i<256;i++) {
            k=getpixel(Image[0],dot[i].x,dot[i].y);
            DrawLine(xs-1+i,n-t,xs+i,n-k,clrref);
		    t=k;
		 }
	  }
      else if (image->bitcount==24) {
		 for (m=0;m<3;m++) {
		    n=165*(m+1);
            FillDdbWin(xs,n-162,260,165,RGB(255,255,255),RGB(255,255,255));
            DrawLine(xs,n-160,xs+256,n-160,color_tab[2*m]);
            DrawLine(xs,n,xs+256,n,color_tab[2*m]);

			if (m==0)     clrref=RGB(255,0,0);
            else if (m==1)clrref=RGB(0,255,0);
            else if (m==2)clrref=RGB(0,0,255);

            color=getpixel(Image[0],dot[0].x,dot[0].y);
	        t=(int) (159.0*((color>>(8*(2-m)))&0xff)/255);
            for (i=1;i<j && i<256;i++) {
               color=getpixel(Image[0],dot[i].x,dot[i].y);
	           k=(int) (159.0*((color>>(8*(2-m)))&0xff)/255);
               DrawLine(xs-1+i,n-t,xs+i,n-k,clrref);
			   t=k;
			}
		 }
	  }
      free(dot);
      pxy_n=0;		
   }
   else if ((T_flag==IDM_WINCAPT)&&(pxy_n)) { //  截取屏幕窗口,终点处理
	  if (pxy_f==1) {
         for (k=1;k<pxy_n;k++) {
 	        LineData(k,1);
		 }
	  }
	  x0=pxy[0].x;        y0=pxy[0].y;
	  if (cur_x<x0) {
	     t=cur_x;  cur_x=x0;   x0=t;
	  }
	  if (cur_y<y0) {
		 t=cur_y;  cur_y=y0;   y0=t;
	  }
      dx=cur_x-x0+1;	  dy=cur_y-y0+1;

      WinCapt(hWnd,Image[0],x0,y0,dx,dy); 
      ClearDDB();
      WriteDDB(Image[0],0,0,0,0,dx,dy);

      wid=Image[0]->wid;	hei=Image[0]->hei;
      for (i=1;i<9;i++) 
         if (Image[i]->hdib) ImageClose(Image[i]);
      ImageCopy(0,9);
      T_flag=0;	
   }
   InvalidateRect(hWnd,NULL,FALSE);
   pxy_f=0;
   return 0;
}

void ImageRotate(struct IMAGE *img1,struct IMAGE *img2,double alpha)
{  
   int    i,j,x,y,ww,r,g,b;
   int    Yd,Dx,Dy,bpl,bpp,bits,max,maxn;
   double centerx,centery,sintheta,costheta;
   double X1,Y1,X2,Y2,theta,xx,yy,rr;
   BYTE   *sc,*p;
   char   **list;
 
   Dx=img1->wid;		Dy=img1->hei;
   bpl=(int) img1->bpl;
   bpp=(int) img1->bpp;
   bits=img1->bitcount;
   sc=(BYTE*) malloc(2*bpl);
   list=(char**)malloc(Dy*sizeof(char*));
   for (i=0;i<Dy;i++)  list[i]=img1->lpbits+(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);
 
   ImageCreate(img2,ww,(int) (2*Y1),bits);

   if (bits==8) {
      max=maxn=0;
      for (i=0;i<256;i++) {
         getpalette(img1,i,&r,&g,&b);
	     setpalette(img2,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);
		 }
	  }
      setimage(img2,0,Yd,ww,1,sc);
   }
   free(list);
   free(sc);
}

void FillHdcWin(HDC hDC,int x,int y,int Dx,int Dy,
				COLORREF clrref1,COLORREF clrref2)
{
   LOGPEN   lppena = {PS_SOLID,1,1,RGB(0,0,0)};
   HPEN		hPen;
   HBRUSH	hBrush;
 
   lppena.lopnColor=clrref1;
   hPen=(HPEN) SelectObject(hDC,CreatePenIndirect(&lppena));
   hBrush=(HBRUSH) SelectObject(hDC,CreateSolidBrush(clrref2));
   Rectangle(hDC,x,y,x+Dx,y+Dy);
   DeleteObject(SelectObject(hDC,hPen));
   DeleteObject(SelectObject(hDC,hBrush));
}

void Clear(HWND hWnd)
{
  int  i;

  for (i=0;i<9;i++) 
    if (Image[i]->hdib) ImageClose(Image[i]);
 
  ClearDDB();
  InvalidateRect(hWnd,NULL,FALSE);
}


⌨️ 快捷键说明

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