📄 design.c
字号:
#include <utility.h>
#include <ansi_c.h>
#include "Imaq_CVI.h"
#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include "design.h"
static int panelHandle;
static IPIImageRef SourceImage1;
static IPIImageRef SourceImage2;
static IPIImageRef DestImage1;
static IPIImageRef DestImage2;
static IPIImageRef TempImage;
static IPIImageRef TempImage1;
static IPIImageRef TempImage2;
static IPIImageRef TempImage3;
static IPIImageRef TempImage4;
static IPIImageRef TempImage5;
static IPIImageRef RedPlane;
static IPIImageRef GreenPlane;
static IPIImageRef BluePlane;
static IPIImageRef MaskPlane;
static IPIImageRef TempRed;
static IPIImageRef TempGreen;
static IPIImageRef TempBlue;
static int SrcImg;
static int DstImg;
//static int RedImg;
//static int GreenImg;
//static int BlueImg;
static int Proc;
static int i;
//static int nb_of_colors;
//static int color_table[1024];
static int CanvasWidth, CanvasHeight, CanvasTop, CanvasLeft;
static int everload;
static int panelSnap;
static int panelHandle;
static int menubarHandle;
static char lPath[260];
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "design.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
IPI_Create (&SourceImage1, IPI_PIXEL_RGB32, 2); // border size = 2
IPI_Create (&SourceImage2, IPI_PIXEL_RGB32, 2);
IPI_Create (&DestImage1, IPI_PIXEL_RGB32, 2);
IPI_Create (&DestImage2, IPI_PIXEL_RGB32, 2);
IPI_Create (&TempImage, IPI_PIXEL_RGB32, 2);
IPI_Create (&TempImage1, IPI_PIXEL_U8, 2);
IPI_Create (&TempImage2, IPI_PIXEL_U8, 2);
IPI_Create (&TempImage3, IPI_PIXEL_U8, 2);
IPI_Create (&TempImage4, IPI_PIXEL_U8, 2);
IPI_Create (&TempImage5, IPI_PIXEL_U8, 2);
IPI_Create (&TempRed, IPI_PIXEL_U8, 2);
IPI_Create (&TempGreen, IPI_PIXEL_U8, 2);
IPI_Create (&TempBlue, IPI_PIXEL_U8, 2);
IPI_Create (&RedPlane, IPI_PIXEL_U8, 2);
IPI_Create (&GreenPlane, IPI_PIXEL_U8, 2);
IPI_Create (&BluePlane, IPI_PIXEL_U8, 2);
IPI_Create (&MaskPlane, IPI_PIXEL_U8, 2);
// Get the Canvas size and position
GetCtrlAttribute (panelHandle, PANEL_CANVAS_0, ATTR_TOP, &CanvasTop);
GetCtrlAttribute (panelHandle, PANEL_CANVAS_0, ATTR_LEFT, &CanvasLeft);
GetCtrlAttribute (panelHandle, PANEL_CANVAS_0, ATTR_WIDTH, &CanvasWidth);
GetCtrlAttribute (panelHandle, PANEL_CANVAS_0, ATTR_HEIGHT, &CanvasHeight);
Proc=0;
menubarHandle = GetPanelMenuBar (panelHandle);
SetInputMode (panelHandle, PANEL_CANVAS_0, 1);
RunUserInterface ();
return 0;
}
//载入图像
void CVICALLBACK load (int menuBar, int menuItem, void *callbackData,
int panel)
{
IPIError lError;
int lStatus;
lStatus = FileSelectPopup (".\\image.", "*.apd;*.bmp;*.tif", "", "",
VAL_LOAD_BUTTON, 0, 0, 1, 0, lPath);
if (lStatus == VAL_EXISTING_FILE_SELECTED)
{
/* Read the file into the source image */
lError = IPI_ReadFile (SourceImage1, lPath, TRUE, NULL,
NULL);
lError = IPI_ReadFile (TempImage, lPath, TRUE, NULL,NULL);
//清除屏幕
if(everload==1)
{
IPI_WindClose (0, TRUE);
CanvasClear (panelHandle, PANEL_CANVAS_0, VAL_ENTIRE_OBJECT);
CanvasClear (panelHandle, PANEL_CANVAS_1, VAL_ENTIRE_OBJECT);
CanvasClear (panelHandle, PANEL_CANVAS_2, VAL_ENTIRE_OBJECT);
CanvasClear (panelHandle, PANEL_CANVAS_3, VAL_ENTIRE_OBJECT);
CanvasClear (panelHandle, PANEL_CANVAS_4, VAL_ENTIRE_OBJECT);
CanvasClear (panelHandle, PANEL_CANVAS_5, VAL_ENTIRE_OBJECT);
}
everload=1;
if (lError == IPI_ERR_NOERROR)
{
//IPI_Copy (SourceImage1, TempImage) ; //For backup the original image
SetMenuBarAttribute (menubarHandle, menu1_EDIT, ATTR_DIMMED, 0);
SetMenuBarAttribute (menubarHandle, menu1_FILE_SAVE, ATTR_DIMMED, 0);
/*Display the sourec image on the canvas*/
GetBitmapFromFile (lPath, &SrcImg);
CanvasDrawBitmap (panelHandle, PANEL_CANVAS_0, SrcImg, VAL_ENTIRE_OBJECT,
VAL_ENTIRE_OBJECT);
DiscardBitmap(SrcImg);
}
}
}
void CVICALLBACK save (int menuBar, int menuItem, void *callbackData,
int panel)
{
char Pathname[300];
int Status;
//选择循环保证保存的文件是最新操作
switch (Proc)
{
case 0:
DestImage1=SourceImage1;
MessagePopup ("提示", "未进行任何,保存的是原图像");
break;
case 1:
DestImage1=TempImage1;
MessagePopup ("提示", "保存灰阶图像");
break;
case 2:
DestImage1=TempImage2;
MessagePopup ("提示", "保存反相图像");
break;
case 3:
DestImage1=DestImage1;
MessagePopup ("提示", "保存马赛克图像");
break;
case 4:
DestImage1=DestImage2;
MessagePopup ("提示", "保存叠加图像");
break;
case 5:
DestImage1=TempImage5;
MessagePopup ("提示", "保存素描图像");
break;
case 6:
DestImage1=DestImage1;
MessagePopup ("提示", "保存素描图像");
break;
default:
break;
}
Status = FileSelectPopup ("..\\..", "*.bmp", "*.bmp,*.tif,*.apd",
" 选择保存文件的路径 ", VAL_SAVE_BUTTON,
0, 0, 1, 1, Pathname);
if (Status == VAL_NEW_FILE_SELECTED)
{
IPI_WriteFile (DestImage1, Pathname, IPI_FILE_BMP,
NULL, NULL);
}
}
void CVICALLBACK quit (int menuBar, int menuItem, void *callbackData,
int panel)
{
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp1.bmp"); //删除中间文件
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp2.bmp");
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp3.bmp");
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp4.bmp");
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp5.bmp");
DeleteFile ("C:\\Documents and Settings\\All Users\\Documents\\temp6.bmp");
MessagePopup ("提示", "中间文件已经删除");
QuitUserInterface (0);
}
// 色彩色图像转化为黑白图像——图像灰阶处理
void CVICALLBACK proc1 (int menuBar, int menuItem, void *callbackData,
int panel)
{
IPI_Cast (TempImage, IPI_PIXEL_U8); //转换
IPI_Copy (TempImage, TempImage1);
IPI_WriteFile (TempImage1, "C:\\Documents and Settings\\All Users\\Documents\\temp1.bmp", IPI_FILE_BMP, NULL,
NULL);
GetBitmapFromFile ("C:\\Documents and Settings\\All Users\\Documents\\temp1.bmp", &DstImg);
CanvasDrawBitmap (panelHandle, PANEL_CANVAS_1, DstImg, VAL_ENTIRE_OBJECT,
VAL_ENTIRE_OBJECT);
DiscardBitmap(DstImg);
Proc=1;
}
// 图像反相处理
void CVICALLBACK proc2 (int menuBar, int menuItem, void *callbackData,
int panel)
{
IPIImageInfo Image_Info;
int x,y,width,height ;
float value;
//判断TempImage是否已经改变
if (Proc!=1 && Proc!=5)
{
IPI_Cast (TempImage, IPI_PIXEL_U8);
IPI_Copy (TempImage, TempImage1);
}
IPI_GetImageInfo (TempImage, &Image_Info); //读出图像信息
width=Image_Info.width;
height=Image_Info.height;
IPI_Copy (TempImage1, TempImage2);
for(x=0;x<width;x++)
{
for(y=0;y<height;y++)
{
IPI_GetPixelValue(TempImage1,x,y,&value);
value=255-value; //反色
IPI_SetPixelValue(TempImage2,x,y,value);
}
}
IPI_WriteFile (TempImage2, "C:\\Documents and Settings\\All Users\\Documents\\temp2.bmp", IPI_FILE_BMP, NULL,
NULL);
GetBitmapFromFile ("C:\\Documents and Settings\\All Users\\Documents\\temp2.bmp", &DstImg);
CanvasDrawBitmap (panelHandle, PANEL_CANVAS_2, DstImg, VAL_ENTIRE_OBJECT,
VAL_ENTIRE_OBJECT);
DiscardBitmap(DstImg);
Proc=2;
}
// 图像的马赛克处理
void CVICALLBACK proc3 (int menuBar, int menuItem, void *callbackData,
int panel)
{
//
IPIImageInfo Image_Info;
int x,y,width,height;
float value1,value2,value3,value4,value5,value6,value7,value8,value9
,value10,value11,value12,value13,value14,value15,value16,average;
//提取RGB三色
IPI_ExtractColorPlanes (SourceImage1, RedPlane, GreenPlane,
BluePlane, IPI_RGB);
IPI_GetImageInfo (RedPlane, &Image_Info); //读出图像信息
width=Image_Info.width;
height=Image_Info.height;
IPI_Copy (RedPlane, TempRed);
IPI_Copy (GreenPlane, TempGreen);
IPI_Copy (BluePlane, TempBlue);
//红色通道马赛克
for(x=0;x<width;)
{
for(y=0;y<height;)
{
IPI_GetPixelValue(RedPlane,x,y,&value1); //取4*4点的值
IPI_GetPixelValue(RedPlane,x,y+1,&value2);
IPI_GetPixelValue(RedPlane,x,y+2,&value3);
IPI_GetPixelValue(RedPlane,x,y+3,&value4);
IPI_GetPixelValue(RedPlane,x+1,y,&value5);
IPI_GetPixelValue(RedPlane,x+1,y+1,&value6);
IPI_GetPixelValue(RedPlane,x+1,y+2,&value7);
IPI_GetPixelValue(RedPlane,x+1,y+3,&value8);
IPI_GetPixelValue(RedPlane,x+2,y,&value9);
IPI_GetPixelValue(RedPlane,x+2,y+1,&value10);
IPI_GetPixelValue(RedPlane,x+2,y+2,&value11);
IPI_GetPixelValue(RedPlane,x+2,y+3,&value12);
IPI_GetPixelValue(RedPlane,x+3,y,&value13);
IPI_GetPixelValue(RedPlane,x+3,y+1,&value14);
IPI_GetPixelValue(RedPlane,x+3,y+2,&value15);
IPI_GetPixelValue(RedPlane,x+3,y+3,&value16);
average=(value1+value2+value3+value4+value5+value6+value7+value8+value9+ //求平均值
value10+value11+value12+value13+value14+value15+value16)/16;
IPI_SetPixelValue(TempRed,x,y,average); //新图像赋值
IPI_SetPixelValue(TempRed,x,y+1,average);
IPI_SetPixelValue(TempRed,x,y+2,average);
IPI_SetPixelValue(TempRed,x,y+3,average);
IPI_SetPixelValue(TempRed,x,y+4,average);
IPI_SetPixelValue(TempRed,x+1,y,average);
IPI_SetPixelValue(TempRed,x+1,y+1,average);
IPI_SetPixelValue(TempRed,x+1,y+2,average);
IPI_SetPixelValue(TempRed,x+1,y+3,average);
IPI_SetPixelValue(TempRed,x+1,y+4,average);
IPI_SetPixelValue(TempRed,x+2,y,average);
IPI_SetPixelValue(TempRed,x+2,y+1,average);
IPI_SetPixelValue(TempRed,x+2,y+2,average);
IPI_SetPixelValue(TempRed,x+2,y+3,average);
IPI_SetPixelValue(TempRed,x+2,y+4,average);
IPI_SetPixelValue(TempRed,x+3,y,average);
IPI_SetPixelValue(TempRed,x+3,y+1,average);
IPI_SetPixelValue(TempRed,x+3,y+2,average);
IPI_SetPixelValue(TempRed,x+3,y+3,average);
IPI_SetPixelValue(TempRed,x+3,y+4,average);
IPI_SetPixelValue(TempRed,x+4,y,average);
IPI_SetPixelValue(TempRed,x+4,y+1,average);
IPI_SetPixelValue(TempRed,x+4,y+2,average);
IPI_SetPixelValue(TempRed,x+4,y+3,average);
IPI_SetPixelValue(TempRed,x+4,y+4,average);
y=y+4;
}
x=x+4;
}
//绿色通道马赛克
for(x=0;x<width;)
{
for(y=0;y<height;)
{
IPI_GetPixelValue(GreenPlane,x,y,&value1);
IPI_GetPixelValue(GreenPlane,x,y+1,&value2); //取4*4点的值
IPI_GetPixelValue(GreenPlane,x,y+2,&value3);
IPI_GetPixelValue(GreenPlane,x,y+3,&value4);
IPI_GetPixelValue(GreenPlane,x+1,y,&value5);
IPI_GetPixelValue(GreenPlane,x+1,y+1,&value6);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -