📄 sample22.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 + -