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

📄 ccview.c

📁 image processing including fourier,wavelet,segmentation etc.
💻 C
字号:
/*--------------------------- Commande MegaWave -----------------------------*//* mwcommand  name = {ccview};  version = {"1.13"};  author = {"Jacques Froment"};  function = {"View a color image on a window"};  usage = {  'x':[pos_x=50]->x0      "X coordinate for the upper-left corner of the Window",  'y':[pos_y=50]->y0      "Y coordinate for the upper-left corner of the Window",  'z':[zoom=1.0]->zoom      "Zoom factor",  'o':[order=0]->order            "Zoom order: 0,1=linear,-3=cubic,3,5..11=spline, default 0",  'N'->no_refresh      "Do not refresh the window (library call)",   ccimage->image        "Input image (should be a ccimage)",   notused->window       "Window to view the image (internal use)"  };*//*---------------------------------------------------------------------- v1.12: added -o option + several minor modifications (L.Moisan) v1.13: fixed lag due to usleep() (L.Moisan)----------------------------------------------------------------------*/#include <stdio.h>#include "mw.h"/* Include the window since we use windows facility */#include "window.h"/* Param structure used to send parameters to ccview_notify() */typedef struct ccview_SParam {    Ccimage image_work;      unsigned char *image_red_save;    unsigned char *image_green_save;    unsigned char *image_blue_save;  } *ccview_Param;int GLprint;  /* Toggle to print the R,G,B values */int oldx1,oldy1,oldevent,zfactor;void ccview_notify_help(){  printf("\n\t\tHelp on line\n");  printf("\nMouse:\n");  printf("\tLeft button: toggle to print the RGB value at the current coordinates (x,y).\n");  printf("\tMiddle button: Restore the image\n");  printf("\tRight button: Local zooming\n");  printf("\nKeyboard:\n");  printf("\tQ: Quit.\n");  printf("\tH: Help.\n");}/*     A notify function must return a value ....      *//*       0 if there was no event catched               *//*     > 0 if there was an event catched (but Destroy) *//*      -1 if the event Destroy was catched (or 'Q')   */int ccview_notify(ImageWindow,param)Wframe *ImageWindow;void *param;          /* Users's parameters: don't forget the cast ! */{  int x1,y1,wz,event,button_mask,ret,imsize,c;  char mess[90];  int nred,ngreen,nblue,l;  ccview_Param images;  Ccimage image;  unsigned char *red_save, *green_save, *blue_save;  images = (ccview_Param) param;  /* Cast */  image = images->image_work;  red_save = images->image_red_save;  green_save = images->image_green_save;  blue_save = images->image_blue_save;  imsize = image->ncol*image->nrow;#define ZFMAX 4 /* Zoom Factor Max */  event = WUserEvent(ImageWindow); /* User's event on ImageWindow */  if (event < 0) ret=1; else ret=event;  if (event != W_DESTROY)    {      WGetStateMouse(ImageWindow,&x1,&y1,&button_mask);            if (GLprint == 1)  	{	  if ((x1>=0)&&(x1<image->ncol)&&(y1>=0)&&(y1<image->nrow))	    {	      l =  x1 + (image->ncol)* y1;	      nred = image->red[l];	      ngreen = image->green[l];	      nblue = image->blue[l];	    }	  else { nred = ngreen = nblue = -1; }	  sprintf(mess," (%3d,%3d): (%3d,%3d,%3d) ",x1,y1,nred,ngreen,nblue);	  WDrawString(ImageWindow,0,10,mess);	  WFlushAreaWindow(ImageWindow,0,0,image->ncol-1,12);	  /* usleep(100);*/	}    }  switch(event)    {    case W_MS_LEFT:      GLprint = 1 - GLprint;      if (GLprint == 0)	{	  WRestoreImageWindow(ImageWindow,0,0,image->ncol,image->nrow); 	  WFlushWindow(ImageWindow);	}      oldevent = event;      break;          case W_MS_MIDDLE:       memcpy(image->red,red_save,imsize);      memcpy(image->green,green_save,imsize);      memcpy(image->blue,blue_save,imsize);      if (WLoadBitMapColorImage(ImageWindow,image->red,image->green,				image->blue,image->ncol,image->nrow) != 0) 	return(-1);      WRestoreImageWindow(ImageWindow,0,0,image->ncol,image->nrow);       WFlushWindow(ImageWindow);      zfactor = 2;       oldevent = event;      break;    case W_MS_RIGHT:      if ((oldx1 == x1) && (oldy1 == y1) && (oldevent == event)) 	{	  zfactor+=1;	  if (zfactor > ZFMAX) zfactor = ZFMAX;	}      else 	{	  if (zfactor > 2)	    {	      memcpy(image->red,red_save,imsize);	      memcpy(image->green,green_save,imsize);	      memcpy(image->blue,blue_save,imsize);		      if (WLoadBitMapColorImage(ImageWindow,image->red,image->green,				image->blue,image->ncol,image->nrow) != 0) 		return(-1);	      WRestoreImageWindow(ImageWindow,0,0,image->ncol,image->nrow);	      WFlushWindow(ImageWindow);	      zfactor = 2; 	      oldevent = event;	      oldx1 = x1;	      oldy1 = y1;	      break;	    }	  zfactor = 2;	  memcpy(image->red,red_save,imsize);	  memcpy(image->green,green_save,imsize);	  memcpy(image->blue,blue_save,imsize);		}      /* Size of the zoom window */      if (image->ncol >= image->nrow) 	wz = zfactor*image->nrow/16;      else 	wz = zfactor*image->ncol/16;      image = (Ccimage) cclocal_zoom(image, &x1, &y1, &wz, &zfactor);      if (WLoadBitMapColorImage(ImageWindow,image->red,image->green,				image->blue,image->ncol,image->nrow) != 0) 	return(-1);      WRestoreImageWindow(ImageWindow,0,0,image->ncol,image->nrow);       WFlushWindow(ImageWindow);      oldevent = event;      oldx1 = x1;      oldy1 = y1;      break;    case W_RESIZE:      oldevent = event;      break;    case W_DESTROY:      ret=-1;      break;     case W_KEYPRESS:      c = WGetKeyboard();      switch(c)	{	case 'q': case 'Q': ret =-1;	  break;	case 'h': case 'H': ccview_notify_help();	  break;	default:	  if (c>>8==0)	    mwerror(WARNING,1,"Unrecognized Key '%c'. Type H for Help.\n",c);	}      oldevent = event;       break;    }  if (ret == -1)    {      free(param);      free(blue_save);      free(green_save);      free(red_save);    }  return(ret);}void ccview(image,x0,y0,zoom,order,no_refresh,window)int *x0,*y0,*no_refresh,*order;float *zoom;Ccimage image;char *window;{  Wframe *ImageWindow;  Ccimage zimage=NULL;  unsigned char *red_save,*green_save,*blue_save;  ccview_Param param;  int i,j;  char text[BUFSIZ];  float inverse_zoom;  if (*zoom != 1)     {      zimage = mw_change_ccimage(zimage,0,0);      if (zimage == NULL) mwerror(FATAL,1,"Not enough memory\n");      if (*zoom>1.0) 	cczoom(image,zimage,NULL,NULL,zoom,order,NULL);      else {	inverse_zoom = 1./(*zoom);	cczoom(image,zimage,NULL,NULL,&inverse_zoom,order,(char *)1);      }      sprintf(text,"%s (%.1fX)",image->name,*zoom);      mw_delete_ccimage(image);      image = zimage;    }  else strcpy(text,image->name);    ImageWindow = (Wframe *)    mw_get_window((Wframe *) window,image->ncol,image->nrow,*x0,*y0,		  text);  if (ImageWindow == NULL)    mwerror(INTERNAL,1,"NULL window returned by mw_get_window\n");  WLoadBitMapColorImage(ImageWindow,image->red,image->green,image->blue,			image->ncol,image->nrow);   WRestoreImageWindow(ImageWindow,0,0,image->ncol,image->nrow);   WFlushWindow(ImageWindow);  GLprint = 0;  oldx1 = oldy1 = oldevent = -1;  zfactor = 2;  red_save = (unsigned char *) malloc(image->ncol * image->nrow);  green_save = (unsigned char *) malloc(image->ncol * image->nrow);  blue_save = (unsigned char *) malloc(image->ncol * image->nrow);  param = (ccview_Param) malloc(sizeof(struct ccview_SParam));  if ((red_save == NULL) || (green_save == NULL) ||       (blue_save == NULL) || (param == NULL))    mwerror(FATAL,1,"not enough memory\n");  memcpy(red_save,image->red,image->ncol * image->nrow);  memcpy(green_save,image->green,image->ncol * image->nrow);  memcpy(blue_save,image->blue,image->ncol * image->nrow);  WSetUserEvent(ImageWindow,W_MS_BUTTON | W_KEYPRESS);  param->image_work = image;  param->image_red_save = red_save;  param->image_green_save = green_save;  param->image_blue_save = blue_save;  mw_window_notify(ImageWindow,(void *)param,ccview_notify);  if (!no_refresh) mw_window_main_loop();}

⌨️ 快捷键说明

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