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

📄 colorope.c

📁 C++写的直方图修正程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);
			lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes);
			for(x=0;x<bi.biWidth;x++){
				Blue=(unsigned char )(*lpPtr++);
				Green=(unsigned char )(*lpPtr++);
				Red=(unsigned char )(*lpPtr++);
				Y=(float)(Red*0.299+Green*0.587+Blue*0.114);
				Gray=(BYTE)Y;
				*(lpTempPtr++)=(unsigned char)Gray;
			}
		}

    if(hBitmap!=NULL)
	    DeleteObject(hBitmap);
	
	hBitmap=CreateDIBitmap(hDc,	(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
				(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NewNumColors*sizeof(RGBQUAD),
   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);

	if(hPalette && hPrevPalette){
		SelectPalette(hDc,hPrevPalette,FALSE);
		RealizePalette(hDc);
	}

    hf=_lcreat("c:\\gray.bmp",0);
	_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 
	_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
	_lclose(hf);

 	ReleaseDC(hWnd,hDc);
	LocalUnlock(hTempImgData);
	LocalFree(hTempImgData);
	GlobalUnlock(hImgData);
	return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL Invert(HWND hWnd)
{
	DWORD              BufSize;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	HDC                hDc;
	HFILE              hf;
	LONG               x,y;
    LOGPALETTE         *pPal;
    HPALETTE           hPrevPalette=NULL; 
	HLOCAL             hPal;
	DWORD              i;
	unsigned char      Red,Green,Blue;

	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);
	if(NumColors!=0){
		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 < NumColors; i++) {
			Blue=(unsigned char )(*lpPtr++);
			Green=(unsigned char )(*lpPtr++);
			Red=(unsigned char )(*lpPtr++);
			lpPtr++;
     		pPal->palPalEntry[i].peRed=(BYTE)(255-Red);
			pPal->palPalEntry[i].peGreen=(BYTE)(255-Green);
			pPal->palPalEntry[i].peBlue=(BYTE)(255-Blue);
			pPal->palPalEntry[i].peFlags=0;
			*(lpTempPtr++)=(unsigned char)(255-Blue);
			*(lpTempPtr++)=(unsigned char)(255-Green);
			*(lpTempPtr++)=(unsigned char)(255-Red);
			*(lpTempPtr++)=0;
		}

		if(hPalette!=NULL)                     
			DeleteObject(hPalette);
		hPalette=CreatePalette(pPal);
		LocalUnlock(hPal);
		LocalFree(hPal);
		if(hPalette){
			hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
			RealizePalette(hDc);
		}
	}
	else{
		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++){
				Blue=(unsigned char )(*lpPtr++);
				Green=(unsigned char )(*lpPtr++);
				Red=(unsigned char )(*lpPtr++);
				*(lpTempPtr++)=(unsigned char)(255-Blue);
				*(lpTempPtr++)=(unsigned char)(255-Green);
				*(lpTempPtr++)=(unsigned char)(255-Red);
			}
		}
	}

    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:\\invert.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 Histogram(HWND hWnd)
{
	DWORD              OffBits,BufSize;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	int				   x,y;
	int                grayindex;
	HWND			   hPopupWnd;
	int                temp;
	
	for(grayindex=0;grayindex<256;grayindex++)
		GrayTable[grayindex]=0;

	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

	for(y=0;y<bi.biHeight;y++){
		lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
		for(x=0;x<bi.biWidth;x++){
			grayindex=(unsigned char)*(lpPtr++);
			GrayTable[grayindex]++;
		}
	}

	MaxGrayNum=0;
	MinGrayNum=65535;

	for(grayindex=0;grayindex<256;grayindex++){
		temp=GrayTable[grayindex];
		if(temp>MaxGrayNum)
			MaxGrayNum=temp;
		if( (temp<MinGrayNum) && (temp>0) )
			MinGrayNum=temp;
	}

	GlobalUnlock(hImgData);
    hPopupWnd = CreateWindow (
							  "PopupWindowClass",
							  "Histogram Statistic Window",
    						  WS_OVERLAPPEDWINDOW,
    						  50,80,550,350,
    						  hWnd,NULL,ghInst,NULL
    						  );
	if (hPopupWnd){
		ShowWindow (hPopupWnd, SW_SHOW);
   		UpdateWindow (hPopupWnd);
   	}
	return TRUE;
}
////////////////////////////////////////////////////////////////
long FAR PASCAL PopupWndProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	HDC 			hdc;
	PAINTSTRUCT 	ps;   
	DWORD		 	i;
	int             xstart;   
	static LOGPEN   blp={PS_SOLID,1,1,RGB(0,0,255)};
	HPEN            bhp;
	float           a,b,temp;
	char            str[10];
	
	a=(float)(265.0 /( MaxGrayNum - MinGrayNum) );
	b=(float) (270.0-a* MaxGrayNum);
    switch (message)
    	{
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
	    bhp = CreatePenIndirect(&blp);
		SelectObject(hdc,bhp);
        MoveToEx(hdc,2,270,NULL);
        LineTo(hdc,518,270);
        xstart=2;
        for(i=0;i<256;i++){
        	MoveToEx(hdc,xstart,270,NULL);
			if (GrayTable[i]!=0) 
				temp=(float)(a*GrayTable[i]+b);
			else temp=0.0f;
        	LineTo(hdc,xstart,270-(int)temp);
			if (i%16 ==0){
        		MoveToEx(hdc,xstart,270,NULL);
        		LineTo(hdc,xstart,280);
				_itoa(i,str,10);
				TextOut(hdc,xstart,285,str,strlen(str));
			}
        	xstart+=2;
        }
   		MoveToEx(hdc,xstart,270,NULL);
   		LineTo(hdc,xstart,280);
		TextOut(hdc,xstart,285,"256",strlen("256"));
        EndPaint(hWnd,&ps);	
        DeleteObject(bhp);
        break;
    default:
    	break;
    	}	
    return DefWindowProc (hWnd, message, wParam, lParam);
}
////////////////////////////////////////////////////////////////
BOOL Trueto256(HWND hWnd)
{
	DWORD              SrcBufSize,OffBits,DstBufSize,DstLineBytes;
    LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	HDC                hDc;
	HFILE              hf;
	LONG               x,y;
	BITMAPFILEHEADER   DstBf;
	BITMAPINFOHEADER   DstBi;
    LOGPALETTE         *pPal;
    HPALETTE           hPrevPalette; 
	HLOCAL             hPal;
	WORD               i,j;
	int				   Red,Green,Blue,ClrIndex;
	DWORD              ColorHits[4096];
	WORD               ColorIndex[4096];
	DWORD              PalCounts,temp;
	long			   ColorError1,ColorError2;

	if(NumColors!=0){
    	MessageBox(hWnd,"Must be a true color bitmap!","Error Message",MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }

	DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*8);
	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);
	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));
	memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));
	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);
	DstBf.bfOffBits=(DWORD)(256*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
							+sizeof(BITMAPINFOHEADER));
	DstBi.biClrUsed=0;
	DstBi.biBitCount=8;

	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
	
	if((hTempImgData=LocalAlloc(LHND,DstBufSize))==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);
	//overwrite bitmapinfoheader with the new one
	memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));

	memset(ColorHits,0,4096*sizeof(DWORD));
	memset(ColorIndex,0,4096*sizeof(WORD));
	for(y=0;y<bi.biHeight;y++){
		lpPtr=(unsigned char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);
		for(x=0;x<bi.biWidth;x++){
			Blue=(int)(*(lpPtr++) & 0xf0);
			Green=(int)(*(lpPtr++) & 0xf0);
			Red=(int)(*(lpPtr++) & 0xf0);
			ClrIndex=(Blue<<4) + Green +(Red >>4);
			ColorHits[ClrIndex]++;
		}
	}

	PalCounts=0;
	//pack the color table
    for (ClrIndex = 0; ClrIndex < 4096; ClrIndex++)
    {
		if(ColorHits[ClrIndex]!=0){
			ColorHits[PalCounts]=ColorHits[ClrIndex];
			ColorIndex[PalCounts]=ClrIndex;
			PalCounts++;
		}
	}
    //sort the color table downsize
    for (i = 0; i < PalCounts-1; i++)
		for (j = i + 1; j < PalCounts; j++){
			if (ColorHits[j] > ColorHits[i]){
				temp = ColorHits[i];
				ColorHits[i] = ColorHits[j];
				ColorHits[j] = temp;  
	            temp = ColorIndex[i];
		        ColorIndex[i] = ColorIndex[j];
			    ColorIndex[j] = (WORD)temp;
			}
		}
	
    hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + 256* sizeof(PALETTEENTRY));
    pPal =(LOGPALETTE *)LocalLock(hPal);
    pPal->palNumEntries =(WORD) 256;
	pPal->palVersion    = 0x300;

	lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);
	for (i = 0; i < 256; i++) {
   		pPal->palPalEntry[i].peRed=(BYTE)((ColorIndex[i] & 0x00f) << 4);
		pPal->palPalEntry[i].peGreen=(BYTE)((ColorIndex[i] & 0x0f0));
		pPal->palPalEntry[i].peBlue=(BYTE)((ColorIndex[i] & 0xf00) >> 4);
		pPal->palPalEntry[i].peFlags=(BYTE)0;
		*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0xf00) >> 4);
		*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x0f0));
		*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x00f) << 4);
		*(lpTempPtr++)=0;
		ColorHits[i]=i;
	}

	//其余的颜色依据最小平方差近似为前256中最接近的一种
    if (PalCounts > 256){
		for (i = 256; i < PalCounts; i++){
			ColorError1=1000000000;
			Blue = (long)((ColorIndex[i] & 0xf00) >> 4);
			Green = (long)((ColorIndex[i] & 0x0f0));
			Red = (long)((ColorIndex[i] & 0x00f) << 4);
			ClrIndex = 0;
			for (j = 0; j < 256; j++){
				ColorError2=(long)(Blue-pPal->palPalEntry[j].peBlue)*(Blue-pPal->palPalEntry[j].peBlue)+ 
                        (long)(Green-pPal->palPalEntry[j].peGreen)*(Green-pPal->palPalEntry[j].peGreen)+
                        (long)(Red-pPal->palPalEntry[j].peRed)*(Red-pPal->palPalEntry[j].peRed); 
                if (ColorError2 < ColorError1){
					ColorError1 = ColorError2;
					ClrIndex = j;
                }
			}                        
			ColorHits[i] = ClrIndex;
		}
	}                

	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+(SrcBufSize-LineBytes-y*LineBytes);
		lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes);
		for(x=0;x<bi.biWidth;x++){
			Blue=(int)(*(lpPtr++) & 0xf0);
			Green=(int)(*(lpPtr++) & 0xf0);
			Red=(int)(*(lpPtr++) & 0xf0);
			ClrIndex=(Blue<<4) + Green +(Red >>4);
            for (i = 0; i < PalCounts;i++)
				if (ClrIndex == ColorIndex[i]){
					*(lpTempPtr++)=(unsigned char)ColorHits[i];
                    break;
				}
		}
	}

    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:\\256.bmp",0);
	_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 
	_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
	_lclose(hf);

 	ReleaseDC(hWnd,hDc);
	LocalUnlock(hTempImgData);
	LocalFree(hTempImgData);
	GlobalUnlock(hImgData);
	return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL ContrastStretch(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,g1,g2,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( StretchRatio*(SecondPoint-FirstPoint) > 255.0){
    	MessageBox(hWnd,"StretchRatio*(SecondPoint-FirstPoint)  can not be larger than 255!","Error Message",MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
	if( (SecondPoint-FirstPoint) >=255){
    	MessageBox(hWnd,"The area you selected can not be the whole scale!","Error Message",MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
	a=(float)((255.0-StretchRatio*(SecondPoint-FirstPoint))/(255.0-(SecondPoint-FirstPoint))); 
	g1=a*FirstPoint;
	g2=StretchRatio*(SecondPoint-FirstPoint)+g1;

	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=(float)(a*Gray);

⌨️ 快捷键说明

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