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

📄 colorope.c

📁 这是我珍藏的图像处理入门C源码分析,给大家共享了!
💻 C
📖 第 1 页 / 共 4 页
字号:
	LocalFree(hPal);

	if(hPalette){

		hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

		RealizePalette(hDc);

	}



    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	

	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



	if(hPalette && hPrevPalette){

		SelectPalette(hDc,hPrevPalette,FALSE);

		RealizePalette(hDc);

	}



    hf=_lcreat("c:\\cliping.bmp",0);

	_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL Thresholding(HWND hWnd)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

    LOGPALETTE         *pPal;

    HPALETTE           hPrevPalette=NULL; 

	HLOCAL             hPal;

	DWORD              i;

	unsigned char      Gray;



	if( NumColors!=256){

    	MessageBox(hWnd,"Must be a 256 grayscale bitmap!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

	dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );

	DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);

	FreeProcInstance ( (FARPROC) dlgInputBox );

	if( FirstPoint >255){

    	MessageBox(hWnd,"The point you selected must be within [0-255]","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

	if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

    {

    	MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    

	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

	//copy image data

	memcpy(lpTempImgData,lpImgData,BufSize);



	hDc=GetDC(hWnd);



	lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

	lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

	hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));

	pPal =(LOGPALETTE *)LocalLock(hPal);

	pPal->palNumEntries =(WORD) NumColors;

	pPal->palVersion    = 0x300;

	for (i = 0; i < 256; i++) {

		Gray=(unsigned char )*lpPtr;

		lpPtr+=4;

		if(Gray<FirstPoint) Gray=0;

		else Gray=255;

   		pPal->palPalEntry[i].peRed=Gray;

		pPal->palPalEntry[i].peGreen=Gray;

		pPal->palPalEntry[i].peBlue=Gray;

		pPal->palPalEntry[i].peFlags=0;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=0;

	}



	if(hPalette!=NULL)                     

		DeleteObject(hPalette);

	hPalette=CreatePalette(pPal);

	LocalUnlock(hPal);

	LocalFree(hPal);

	if(hPalette){

		hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

		RealizePalette(hDc);

	}



    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	

	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



	if(hPalette && hPrevPalette){

		SelectPalette(hDc,hPrevPalette,FALSE);

		RealizePalette(hDc);

	}



    hf=_lcreat("c:\\threshold.bmp",0);

	_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL Slice(HWND hWnd,BOOL WithBack)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

    LOGPALETTE         *pPal;

    HPALETTE           hPrevPalette=NULL; 

	HLOCAL             hPal;

	DWORD              i;

	unsigned char      Gray;



	if( NumColors!=256){

    	MessageBox(hWnd,"Must be a 256 grayscale bitmap!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

	dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );

	DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);

	FreeProcInstance ( (FARPROC) dlgInputBox );



	if( (SecondPoint-FirstPoint) >255){

    	MessageBox(hWnd,"The area you selected must be within [0-255]!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

	if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

    {

    	MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    

	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

	//copy image data

	memcpy(lpTempImgData,lpImgData,BufSize);



	hDc=GetDC(hWnd);

	lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

	lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

	hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));

	pPal =(LOGPALETTE *)LocalLock(hPal);

	pPal->palNumEntries =(WORD) NumColors;

	pPal->palVersion    = 0x300;

	for (i = 0; i < 256; i++) {

		Gray=(unsigned char )*lpPtr;

		lpPtr+=4;

		if(WithBack){

			if( (Gray>=FirstPoint) && (Gray<=SecondPoint))

				Gray=255;

		}

		else{

			if(Gray<FirstPoint) Gray=0;

			else if (Gray<SecondPoint) Gray=255;

			else Gray=0;

		}

   		pPal->palPalEntry[i].peRed=Gray;

		pPal->palPalEntry[i].peGreen=Gray;

		pPal->palPalEntry[i].peBlue=Gray;

		pPal->palPalEntry[i].peFlags=0;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=0;

	}



	if(hPalette!=NULL)                     

		DeleteObject(hPalette);

	hPalette=CreatePalette(pPal);

	LocalUnlock(hPal);

	LocalFree(hPal);

	if(hPalette){

		hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

		RealizePalette(hDc);

	}



    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	

	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



	if(hPalette && hPrevPalette){

		SelectPalette(hDc,hPrevPalette,FALSE);

		RealizePalette(hDc);

	}



	if(WithBack)

		hf=_lcreat("c:\\sliceb.bmp",0);

	else

		hf=_lcreat("c:\\slice.bmp",0);



	_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL HistogramEqua(HWND hWnd)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              BufSize,OffBits;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

    LOGPALETTE         *pPal;

    HPALETTE           hPrevPalette; 

	HLOCAL             hPal;

	WORD               i;

	int  			   Gray;

	DWORD              GrayHits[256];

	int				   GrayIndex[256];

	float              s[256];



	if( NumColors!=256){

    	MessageBox(hWnd,"Must be a 256 grayscale bitmap!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

	dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );

	DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);

	FreeProcInstance ( (FARPROC) dlgInputBox );

	if( EquaScale >=255){

    	MessageBox(hWnd,"The new scale can not be larger than 255","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

	

	if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)

    {

    	MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }



    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    

	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);



	//copy image data

	memcpy(lpTempImgData,lpImgData,OffBits);



	memset(GrayHits,0,256*sizeof(DWORD));

	memset(GrayIndex,0,256*sizeof(WORD));

	for(y=0;y<bi.biHeight;y++){

		lpPtr=(unsigned char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

		for(x=0;x<bi.biWidth;x++){

			Gray=(unsigned char )*(lpPtr++);

			GrayHits[Gray]++;

		}

	}



	for(i=0;i<256;i++)

		s[i]=(float)GrayHits[i]/((float)bi.biWidth*(float)bi.biHeight);

	

	for(i=1;i<256;i++)

		s[i]+=s[i-1];



	for(i=0;i<256;i++)

		GrayIndex[i]=(int)(s[i]*(EquaScale-1));



    hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + 256* sizeof(PALETTEENTRY));

    pPal =(LOGPALETTE *)LocalLock(hPal);

	memset(pPal,0,sizeof(LOGPALETTE) + 256* sizeof(PALETTEENTRY));

    pPal->palNumEntries =(WORD) 256;

	pPal->palVersion    = 0x300;

	lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

	for (i = 0; i < EquaScale; i++) {

		Gray=(int)(i*255.0/(EquaScale-1));

   		pPal->palPalEntry[i].peRed=(BYTE)Gray;

		pPal->palPalEntry[i].peGreen=(BYTE)Gray;

		pPal->palPalEntry[i].peBlue=(BYTE)Gray;

		pPal->palPalEntry[i].peFlags=(BYTE)0;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=(unsigned char)Gray;

		*(lpTempPtr++)=0;

	}

	if(hPalette!=NULL)                     

        DeleteObject(hPalette);

	

	//create new logic palette		

	hPalette=CreatePalette(pPal);

	LocalUnlock(hPal);

	LocalFree(hPal);



	hDc=GetDC(hWnd);

	if(hPalette){

        hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

		RealizePalette(hDc);

	}



	for(y=0;y<bi.biHeight;y++){

		lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

		lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);

		for(x=0;x<bi.biWidth;x++){

			Gray=(unsigned char )*(lpPtr++);

			Gray=GrayIndex[Gray];

			*(lpTempPtr++)=(unsigned char)Gray;

		}

	}



    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	

	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD),

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



	if(hPalette && hPrevPalette){

		SelectPalette(hDc,hPrevPalette,FALSE);

		RealizePalette(hDc);

	}



    hf=_lcreat("c:\\equa.bmp",0);

	_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

⌨️ 快捷键说明

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