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

📄 colorope.c

📁 C++写的直方图修正程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		else if (Gray<SecondPoint) g=g1+StretchRatio*(Gray-FirstPoint);
		else g=g2+a*(Gray-SecondPoint);
   		pPal->palPalEntry[i].peRed=(BYTE)g;
		pPal->palPalEntry[i].peGreen=(BYTE)g;
		pPal->palPalEntry[i].peBlue=(BYTE)g;
		pPal->palPalEntry[i].peFlags=0;
		*(lpTempPtr++)=(unsigned char)g;
		*(lpTempPtr++)=(unsigned char)g;
		*(lpTempPtr++)=(unsigned char)g;
		*(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:\\stretch.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 Cliping(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;
	float              a,g;

	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;
    }
	a=(float)(255.0/(SecondPoint-FirstPoint)); 

	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) g=0.0f;
		else if (Gray<SecondPoint) g=a*(Gray-FirstPoint);
		else g=255.0f;
   		pPal->palPalEntry[i].peRed=(BYTE)g;
		pPal->palPalEntry[i].peGreen=(BYTE)g;
		pPal->palPalEntry[i].peBlue=(BYTE)g;
		pPal->palPalEntry[i].peFlags=0;
		*(lpTempPtr++)=(unsigned char)g;
		*(lpTempPtr++)=(unsigned char)g;
		*(lpTempPtr++)=(unsigned char)g;
		*(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:\\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 + -