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

📄 sample22.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <ansi_c.h>
#include <cvirte.h>		
#include <userint.h>
#include "sample22.h"
#include "dibpro.h"
#include "toolbox.h"

BITMAPFILEHEADER bmflh;
BITMAPINFOHEADER bmifh;
BYTE *dibBits;
RGBQUAD *dibPalette ;
int colorIntensity[256];
int bitmap,panelHandle,colorNum;
char filename[MAX_PATHNAME_LEN];

int UpdateBitmap(int new);


int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;
		
	if ((panelHandle = LoadPanel (0, "sample22.uir", PANEL)) < 0)
		return -1;
		
    DisplayPanel (panelHandle);
    
    dibBits=NULL;
    dibPalette=NULL;
    
    RunUserInterface ();
	return 0;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
		
            if(dibBits!=NULL)
            {
              free(dibBits);
              dibBits=NULL;
              free(dibPalette);
              dibPalette=NULL;
              DiscardBitmap(bitmap);
			}
			
			QuitUserInterface (0);
			break;
		}
	return 0;
}

void CVICALLBACK OpenBMPFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
	int status;
    FILE* fp;
    
    if(callbackData!=(void *)1)
    {
    status = FileSelectPopup ("C:\\My documents\\Image", "*.bmp", "",
							  "Select File", VAL_LOAD_BUTTON, 0, 0, 1, 0,
							  filename);
	if(status<=0)  return ;
	}
	
    fp = fopen (filename, "rb");
    fread (&bmflh, sizeof(BITMAPFILEHEADER), 1, fp);
    
    if(bmflh.bfType!=19778)  
    {
	   MessagePopup ("Read Error", "This is not BMP file.");
       fclose(fp);
  	   return ;
    }
    
    fread (&bmifh, sizeof(BITMAPINFOHEADER), 1, fp);
    if(bmifh.biBitCount!=8)  
    {
	   MessagePopup ("Read Error", "This is not 256 colors BMP file.");
       fclose(fp);
  	   return ;
    }  
    
	if(bmifh.biClrUsed!=0)
	   colorNum=bmifh.biClrUsed;
	else
	   colorNum=pow(2,bmifh.biBitCount);
	   
	if(dibPalette==NULL)
	  dibPalette=(RGBQUAD*)malloc (sizeof(RGBQUAD)*colorNum);
	else
	  dibPalette=(RGBQUAD*)realloc (dibPalette, sizeof(RGBQUAD)*colorNum);
	  
	if(dibBits==NULL)
	  dibBits=(BYTE*)malloc (sizeof(BYTE)*WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight);
	else
	  dibBits=(BYTE*)realloc (dibBits,
							  sizeof(BYTE)*WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight);
							  
	fread (dibPalette, sizeof(RGBQUAD),colorNum, fp);
	
    fread (dibBits, sizeof(BYTE), WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight, fp);
    
	if(bmifh.biWidth>500)
     	SetPanelAttribute (panel, ATTR_WIDTH, bmifh.biWidth+4);
     	
	if(bmifh.biHeight>400)
    	SetPanelAttribute (panel, ATTR_HEIGHT, bmifh.biHeight+26);
    	
	SetCtrlAttribute (panel, PANEL_CANVAS, ATTR_WIDTH, bmifh.biWidth);
	
	SetCtrlAttribute (panel, PANEL_CANVAS, ATTR_HEIGHT, bmifh.biHeight);
	
    UpdateBitmap(1);
    
	fclose(fp);
}

void CVICALLBACK SaveBMPFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
	int status;
	char filename[MAX_PATHNAME_LEN];
    FILE* fp;
    
    if(dibBits==NULL) return;
    
	status = FileSelectPopup ("C:\\My documents\\Image", "*.bmp", "",
							  "Select File", VAL_SAVE_BUTTON, 0, 0, 1, 0,
							  filename);
	if(status<=0)  return;
	
	fp = fopen (filename, "wb");
	
    fwrite(&bmflh, sizeof(BITMAPFILEHEADER), 1, fp);
    
    fwrite (&bmifh, sizeof(BITMAPINFOHEADER), 1, fp);
    
    fwrite (dibPalette, sizeof(RGBQUAD), colorNum, fp);
    
    fwrite (dibBits, sizeof(BYTE), WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight, fp);
    
	fclose(fp);
}

void CVICALLBACK CloseBMPFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
    CanvasClear (panel, PANEL_CANVAS,  VAL_ENTIRE_OBJECT);
    
            if(dibBits!=NULL)
            {
            free(dibBits); dibBits=NULL;
            free(dibPalette);  dibPalette=NULL;
            DiscardBitmap(bitmap);
			}
}

void CVICALLBACK QuitCallback (int menuBar, int menuItem, void *callbackData,
		int panel)
{
       PanelCallback (panel, EVENT_CLOSE, NULL,0,0);
}

void CVICALLBACK About (int menuBar, int menuItem, void *callbackData,
		int panel)
{
       MessagePopup ("Image Process", "A sample program of Image Process.");
}

void CVICALLBACK Intensity (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  //定义变量
  int i, j, panel2, ipanel, icontrol;

  //如果没有读入位图,退出
  if(dibBits==NULL) return;

  //设置计数为0
  for(i=0;i<256;i++)
       //清零
       colorIntensity[i]=0;

   //计算各个灰度值的计数
    for(i=0;i<bmifh.biHeight;i++)
  {
     for(j=0;j<bmifh.biWidth;j++)
     //计数加一
     colorIntensity[dibBits[WIDTHBYTES(bmifh.biWidth)*i+j]]++;
  }

  //以对话框形式显示面板PANEL_2
  panel2 = LoadPanel (0, "sample22.uir", PANEL_2);
  InstallPopup (panel2);
  
  //在PANEL_2面板GRAPH控件上显示位图直方图
  PlotWaveform (panel2, PANEL_2_GRAPH, colorIntensity, 256,
				VAL_INTEGER, 1.0, 0.0, 0.0, 1.0, VAL_VERTICAL_BAR,
				VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_MAGENTA);
  
  do{
	 GetUserEvent (1, &ipanel, &icontrol);
	 //按下OK键,退出
     if((ipanel==panel2)&&(icontrol==PANEL_2_OKCOMMAND))
		  break;
	} while (1);
   
   //移除对话框
   RemovePopup (0);
}



void CVICALLBACK LinerTran (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  //定义变量
  int panel3,slope,intercept,ipanel,icontrol,i;
  
  //如果位图数据为空,退出
  if(dibBits==NULL) return;
 
  //以对话框形式显示面板PANEL_3
  panel3 = LoadPanel (0, "sample22.uir", PANEL_3);
  InstallPopup (panel3);

  do{
	 GetUserEvent (1, &ipanel, &icontrol);

	 //按下OK,退出循环
     if((ipanel==panel3)&&(icontrol==PANEL_3_OKCOMMAND))
		  break;
   
    //按下Cancel,移除对话框并退出函数
	 if((ipanel==panel3)&&(icontrol==PANEL_3_CANCELCOMMAND))
	      {
          RemovePopup (panel3);
	      return;
          }
	} while (1);

   //获取控件SLOPE和INTERCEPT的值
  GetCtrlVal (panel3, PANEL_3_SLOPE, &slope);
  GetCtrlVal (panel3, PANEL_3_INTERCEPT, &intercept);
  
  //处理位图数据,进行线形变换
  for(i=0;i<WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight;i++)
  {
       dibBits[i]=slope*dibBits[i]+intercept;
       if(dibBits[i]<0) dibBits[i]=0;
       if(dibBits[i]>255)  dibBits[i]=255;
  }

  //移除对话框
  RemovePopup (panel3);
  //更新显示位图
  UpdateBitmap(0);
}


void CVICALLBACK ThresholdTran (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  int panel4,threshold,ipanel,icontrol,i;
  
  if(dibBits==NULL) return;
  
  panel4 = LoadPanel (0, "sample22.uir", PANEL_4);
  InstallPopup (panel4);
  
  do
	{
		 GetUserEvent (1, &ipanel, &icontrol);
		 
		 if((ipanel==panel4)&&(icontrol==PANEL_4_OKCOMMAND))
		  break;
		  
		 if((ipanel==panel4)&&(icontrol==PANEL_4_CANCELCOMMAND))
	      {RemovePopup (panel4); 
	      return; 
	      }
	      
	} while (1);
	
  GetCtrlVal (panel4, PANEL_4_NUMERIC, &threshold);
  
  for(i=0;i<WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight;i++)
  {
       if(dibBits[i]<threshold) 
          dibBits[i]=0;
       else  
         dibBits[i]=255;
  }
  
  RemovePopup (panel4);
  
  UpdateBitmap(0); 
}

void CVICALLBACK IntenEqual (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  //定义变量
  int i,j,temp;
  
  //灰度映射表
  int map[256];

  //如果位图数据为空,退出
  if(dibBits==NULL) return;

  //设置计数为0
  for(i=0;i<256;i++)
       //清零
       colorIntensity[i]=0;

  //计算各个灰度值的计数
  for(i=0;i<bmifh.biHeight;i++)
  {
     for(j=0;j<bmifh.biWidth;j++)
     //计数加一
     colorIntensity[dibBits[WIDTHBYTES(bmifh.biWidth)*i+j]]++;
  }
  
  //计算灰度映射表
  for(i=0;i<256;i++)
  {
     temp=0;
     for(j=0;j<=i;j++)
          temp+=colorIntensity[j];
     
     //计算对应的新灰度值
     map[i]=temp*255/bmifh.biWidth/bmifh.biHeight;
  }

  //位图中的每行
  for(i=0;i<bmifh.biHeight;i++)
  {
     //位图中的每列
     for(j=0;j<WIDTHBYTES(bmifh.biWidth);j++)
           //计算新的灰度值
          dibBits[i*WIDTHBYTES(bmifh.biWidth)+j]=
	      map[dibBits[i*WIDTHBYTES(bmifh.biWidth)+j]];
  }
  
  //更新显示位图
  UpdateBitmap(0);
}

 

void CVICALLBACK ReloadBMPFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   if(dibBits==NULL)  return ;
   
   OpenBMPFile (GetPanelMenuBar(panel),  MENU_FILE_OPEN, (void *)1,panel);
}

void CVICALLBACK FourierTran (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   if(dibBits==NULL)  return ;
   
   Fourier(dibBits, bmifh.biWidth , bmifh.biHeight);
   
   UpdateBitmap(0);
}

void CVICALLBACK CosineTran (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   if(dibBits==NULL)  return ;
   
   DIBDct(dibBits, bmifh.biWidth , bmifh.biHeight);
  
   UpdateBitmap(0);
}

void CVICALLBACK SmoothDIB (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  double array[9]={1,2,1,2,4,2,1,2,1};
  
  if(dibBits==NULL)  return ;
  
  Template(dibBits, bmifh.biWidth , bmifh.biHeight,3,3,1,1,array,0.0625 );
  
  UpdateBitmap(0);
}

void CVICALLBACK LaplasSharp (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  double array[9]={-1,-1,-1,-1,9,-1,-1,-1,-1};
  
  if(dibBits==NULL)  return ;
  
  Template(dibBits, bmifh.biWidth , bmifh.biHeight,3,3,1,1,array,1 );
  
  UpdateBitmap(0);
}

void CVICALLBACK FakeColor (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  int panel5,ipanel,icontrol,model,i;
  
  if(dibBits==NULL)  return ;
   
  panel5 = LoadPanel (0, "sample22.uir", PANEL_5);
  InstallPopup (panel5);
  
  do{
     GetUserEvent (1,&ipanel,&icontrol);
     
     if((ipanel==panel5)&&(icontrol==PANEL_5_OKCOMMAND))
    	break;
    	
     if((ipanel==panel5)&&(icontrol==PANEL_5_CANCELCOMMAND))
        {RemovePopup (panel5);
         return;
        }
   } while (1);
   
  GetCtrlVal (panel5, PANEL_5_RING, &model);
  
  RemovePopup (panel5);
  
  switch(model)
  {
    case 0:
    for(i=0;i<256;i++)
     { 
      dibPalette[i].rgbRed=i;
      dibPalette[i].rgbGreen=i;
      dibPalette[i].rgbBlue=i;
     }
    break;
    case 1:
    for(i=0;i<256;i++)
     { 
      dibPalette[i].rgbRed=i;
      dibPalette[i].rgbGreen=i;
      dibPalette[i].rgbBlue=0;
     }
    break;
    case 2:
    for(i=0;i<256;i++)
     { 
      dibPalette[i].rgbRed=0;
      dibPalette[i].rgbGreen=i;
      dibPalette[i].rgbBlue=i;
     }
    break;
    case 3:
    for(i=0;i<256;i++)
     { 
      dibPalette[i].rgbRed=i;
      dibPalette[i].rgbGreen=0;
      dibPalette[i].rgbBlue=i;
     }
    break;
    case 4:
    for(i=0;i<256;i++)
     { 
      dibPalette[i].rgbRed=HotMentalColorsTable[i][0];
      dibPalette[i].rgbGreen=HotMentalColorsTable[i][1];
      dibPalette[i].rgbBlue=HotMentalColorsTable[i][2];
     }
    break;
  }
  
  UpdateBitmap(0);
}

void CVICALLBACK GaussLaplas (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  double array[25]={-2,-4,-4,-4,-2,-4,0,8,0,-4,-4,8,24,8,-4,
              -4,0,8,0,-4,-2,-4,-4,-4,-2};
              
  if(dibBits==NULL)  return ;
  
  Template(dibBits, bmifh.biWidth , bmifh.biHeight,5,5,2,2,array,1 );
  
  UpdateBitmap(0);
}

void CVICALLBACK RandomNoise (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  if(dibBits==NULL)  return;
  
  RandomNoiseDIB(dibBits, bmifh.biWidth , bmifh.biHeight);
  
  UpdateBitmap(0);
}

void CVICALLBACK SaltNoise (int menuBar, int menuItem, void *callbackData,
		int panel)
{
  if(dibBits==NULL)  return;
  
  SaltNoiseDIB(dibBits, bmifh.biWidth , bmifh.biHeight );
  
  UpdateBitmap(0);
}

int UpdateBitmap(int new)
{
  int i,j,progreeDialog;
  unsigned int *colorTable;
  BYTE *bits;
  
  bits=(BYTE*)malloc(sizeof(BYTE)*WIDTHBYTES(bmifh.biWidth)*bmifh.biHeight);
  colorTable=(unsigned int*)malloc (sizeof(unsigned int)*colorNum);
  
  for(i=0;i<colorNum;i++)
		colorTable[i] = MakeColor (dibPalette[i].rgbRed, dibPalette[i].rgbGreen, 
		                dibPalette[i].rgbBlue);
		                
  progreeDialog = CreateProgressDialog ("DIB Bits Transfer",
									   "Percent Complete", 1,
									   VAL_NO_MARKERS, "");
  for(i=0;i<bmifh.biHeight;i++)
  {
      for(j=0;j<WIDTHBYTES(bmifh.biWidth);j++)
        bits[i*WIDTHBYTES(bmifh.biWidth)+j]=dibBits[(bmifh.biHeight-i-1)*WIDTHBYTES(bmifh.biWidth)+j];
	   
	  UpdateProgressDialog (progreeDialog, (int)(100*i/bmifh.biHeight), 0);
  }   
  
  DiscardProgressDialog (progreeDialog);
  
  if(new)
	NewBitmap (WIDTHBYTES(bmifh.biWidth), 8, bmifh.biWidth,
			   bmifh.biHeight, colorTable, bits, NULL, &bitmap);
  else
	SetBitmapData (bitmap, WIDTHBYTES(bmifh.biWidth), bmifh.biBitCount,
				   colorTable, bits, NULL);
				   
  CanvasDrawBitmap (panelHandle, PANEL_CANVAS, bitmap, VAL_ENTIRE_OBJECT,
					  MakeRect (0, 0, VAL_KEEP_SAME_SIZE, VAL_KEEP_SAME_SIZE));
					  
  free(colorTable);
  free(bits);
  return 1;
}

⌨️ 快捷键说明

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