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

📄 bmp.c

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

{

	DWORD              BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

	unsigned char      num;



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



	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++){

			num=(unsigned char)*lpPtr++;

			if ( (num>>2) > BayerPattern[y&7][x&7])

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

			else *(lpTempPtr++)=(unsigned char)0;

			}

	}

	

    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	hDc=GetDC(hWnd);	

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

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

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



    hf=_lcreat("c:\\limbm3.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 LimbPatternM4(HWND hWnd)

{

	DWORD              BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

	DWORD              i,j;

	unsigned char      num;

	BYTE			   M4Pattern[16][16];



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

		for(j=0;j<8;j++)

			M4Pattern[i][j]=4*BayerPattern[i][j];



	for(i=8;i<16;i++)

		for(j=0;j<8;j++)

			M4Pattern[i][j]=4*BayerPattern[i-8][j]+2;



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

		for(j=8;j<16;j++)

			M4Pattern[i][j]=4*BayerPattern[i][j-8]+3;



	for(i=8;i<16;i++)

		for(j=8;j<16;j++)

			M4Pattern[i][j]=4*BayerPattern[i-8][j-8]+1;



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



	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++){

			num=(unsigned char)*lpPtr++;

			if ( num > M4Pattern[y&15][x&15])

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

			else *(lpTempPtr++)=(unsigned char)0;

			}

	}

	

    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	hDc=GetDC(hWnd);	

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

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

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



    hf=_lcreat("c:\\limbm4.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 Steinberg(HWND hWnd)

{

	DWORD              OffBits,BufSize,IntBufSize;

    LPBITMAPINFOHEADER lpImgData;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpPtr;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

	unsigned char      num;

	float              e,f;

	HLOCAL             hIntBuf;

	int                *lpIntBuf,*lpIntPtr;

	int                tempnum;



	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;

    }



	IntBufSize=(DWORD)bi.biHeight*LineBytes*sizeof(int);

	if((hIntBuf=LocalAlloc(LHND,IntBufSize))==NULL)

    {

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

		LocalFree(hTempImgData);

        return FALSE;

    }



    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    

	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

	lpIntBuf=(int *)LocalLock(hIntBuf);



	//copy header data

	memcpy(lpTempImgData,lpImgData,OffBits);



	//copy image data to int buffer

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

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

		lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;

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

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

	}



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

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

			lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes+x;

			num=(unsigned char)*lpIntPtr;

			if ( num > 128 ){

				*lpIntPtr=255;

				e=(float)(num-255.0);

			}

			else{

				*lpIntPtr=0;

				e=(float)num;

			}

			if(x<bi.biWidth-1){

				f=(float)*(lpIntPtr+1);

				f+=(float)( (3.0/8.0) * e);

				*(lpIntPtr+1)=(int)f;

			}



			if(y<bi.biHeight-1){

				f=(float)*(lpIntPtr-LineBytes);

				f+=(float)( (3.0/8.0) * e);

				*(lpIntPtr-LineBytes)=(int)f;



				f=(float)*(lpIntPtr-LineBytes+1);

				f+=(float)( (1.0/4.0) * e);

				*(lpIntPtr-LineBytes+1)=(int)f;

			}

		}

	}



	//copy new image data from int buffer

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

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

		lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;

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

			tempnum=*(lpIntPtr++);

			if(tempnum>255) tempnum=255;

			else if (tempnum<0) tempnum=0;

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

		}

	}

	

    if(hBitmap!=NULL)

	    DeleteObject(hBitmap);

	hDc=GetDC(hWnd);	

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

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

   				(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);



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

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

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

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	GlobalUnlock(hImgData);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	LocalUnlock(hIntBuf);

	LocalFree(hIntBuf);

	return TRUE;

}

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

BOOL Bmp2Txt(HWND hWnd)

{

	DWORD              OffBits,BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HFILE              hf;

	int				   i, j, k,h,tint,grayindex;

	char               tchar;

	int	               TransHeight, TransWidth;



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

		for(j=i+1;j<95;j++){

			if(gr[i]>gr[j]){

				tchar=ch[i],tint=gr[i];

				ch[i]=ch[j],gr[i]=gr[j];

				ch[j]=tchar,gr[j]=tint;

			}

		}



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

	TransWidth = bi.biWidth/8;

	TransHeight = bi.biHeight/16;

    hf=_lcreat("c:\\bmp2txt.txt",0);



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

		for(j=0;j<TransWidth;j++){

			grayindex=0;

			for(k=0;k<16;k++)

				for(h=0;h<8;h++){

					lpPtr=(char *)lpImgData+BufSize-LineBytes-(i*16+k)*LineBytes+j*8+h;

					grayindex+=(unsigned char)*lpPtr;

				}

			grayindex/=16*8;

			grayindex=gr[94]*grayindex/255;

			k=0;

			while(gr[k+1]<grayindex)

				k++;

			_lwrite(hf,(char *)&ch[k],sizeof(char)); 

		}

		tchar=(char)13;

		_lwrite(hf,(char *)&tchar,sizeof(char)); 

		tchar=(char)10;

		_lwrite(hf,(char *)&tchar,sizeof(char));

	}

	_lclose(hf);

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

       

⌨️ 快捷键说明

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