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

📄 colorope.c

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

			SecondPoint=atoi(str);

        	GetDlgItemText(hDlg,ID_STRETCHRATIO,str,80);

			StretchRatio=(float)atof(str);

        	GetDlgItemText(hDlg,ID_EQUASCALE,str,80);

			EquaScale=atoi(str);

            EndDialog ( hDlg, TRUE );

            return  TRUE;

       	}

        break;

   		}

	return FALSE;			     

}

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

BOOL ColortoGrayScale(HWND hWnd)

{

	DWORD              SrcBufSize,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;

	DWORD			   NewNumColors;

	WORD			   NewBitCount;

	float              Y;

	DWORD              i;

	unsigned char      Red,Green,Blue,Gray;



	NewNumColors=NumColors;

	NewBitCount=bi.biBitCount;

	if(NumColors==0) //true color

	{

		NewNumColors=256;

		NewBitCount=8;

	}



	DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);

	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*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)(NewNumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)

							+sizeof(BITMAPINFOHEADER));

	DstBi.biClrUsed=0;

	DstBi.biBitCount=NewBitCount;



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

	//overwrite bitmapinfoheader with the new one

	memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));



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

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



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

    pPal =(LOGPALETTE *)LocalLock(hPal);

    pPal->palNumEntries =(WORD) NewNumColors;

	pPal->palVersion    = 0x300;



	if(NumColors==0) //true color

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

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

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

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

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

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

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

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

			*(lpTempPtr++)=0;

		}

	else 

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

			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;

			lpPtr++;

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



	hDc=GetDC(hWnd);

	if(hPalette){

        hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

		RealizePalette(hDc);

	}

	

	if(NumColors==0)

		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=(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;

⌨️ 快捷键说明

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