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

📄 colorope.c

📁 这是我珍藏的图像处理入门C源码分析,给大家共享了!
💻 C
📖 第 1 页 / 共 4 页
字号:
	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);

		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);

⌨️ 快捷键说明

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