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

📄 design.c

📁 基于labwindows/cvi的图像的艺术化处理的编程实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -