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

📄 bmp.c

📁 这是我珍藏的图像处理入门C源码分析,给大家共享了!
💻 C
📖 第 1 页 / 共 5 页
字号:
BOOL Zoom(HWND hWnd)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              OffBits,SrcBufSize,DstBufSize,DstLineBytes;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	DWORD              Wold,Hold,Wnew,Hnew;

	HDC                hDc;

	HFILE              hf;

	DWORD              x0,y0,x1,y1;

	float			   num1;

	BITMAPFILEHEADER   DstBf;

	BITMAPINFOHEADER   DstBi;



	dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );

	DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);

	FreeProcInstance ( (FARPROC) dlgInputBox );

	

	num1=(float)(1.0/ZoomRatio);

	Wold=bi.biWidth;

	Hold=bi.biHeight;

	Wnew = (DWORD)(Wold*ZoomRatio+0.5);

    Hnew = (DWORD)(Hold*ZoomRatio+0.5);



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);



	ImgWidth=Wnew;

	ImgHeight=Hnew;



	DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);

	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);



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



	lpPtr=(char *)lpImgData;

	lpTempPtr=(char *)lpTempImgData;



	memset(lpTempPtr,(BYTE)255,DstBufSize);

	memcpy(lpTempPtr,lpPtr,OffBits);

	

	//get new bitmapfileheader and bitmapinfoheader

	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

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

	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

	DstBi.biWidth=Wnew;

	DstBi.biHeight=Hnew;



	//overwrite bitmapinfoheader with the new one

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



	for(y1=0;y1<Hnew;y1++)

		for(x1=0;x1<Wnew;x1++){

			x0= (DWORD)(x1*num1);

			y0= (DWORD)(y1*num1);

			if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))

			{

				lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;

				lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;

				*lpTempPtr=*lpPtr;

			}

	}



	hDc=GetDC(hWnd);

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



    hf=_lcreat("c:\\zoom.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 TemplateOperation(HWND hWnd, int TemplateType)

{

	DWORD              OffBits,BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	HDC                hDc;

	HFILE              hf;

	LONG               x,y;

	float              coef;

	float              CoefArray[9];

	float              TempNum;

	char               filename[80];



	switch(TemplateType){

	case TEMPLATE_SMOOTH_BOX:

		coef=(float)(1.0/9.0);

		memcpy(CoefArray,Template_Smooth_Box,9*sizeof(float));

		strcpy(filename,"c:\\smbox.bmp");

		break;

	case TEMPLATE_SMOOTH_GAUSS:

		coef=(float)(1.0/16.0);

		memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(float));

		strcpy(filename,"c:\\smgauss.bmp");

		break;

	case TEMPLATE_SHARPEN_LAPLACIAN:

		coef=(float)1.0;

		memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(float));

		strcpy(filename,"c:\\shlaplac.bmp");

		break;

	case TEMPLATE_SOBEL_H:

		coef=(float)1.0;

		memcpy(CoefArray,Template_HSobel,9*sizeof(float));

		strcpy(filename,"c:\\hsobel.bmp");

		break;

	case TEMPLATE_SOBEL_V:

		coef=(float)1.0;

		memcpy(CoefArray,Template_VSobel,9*sizeof(float));

		strcpy(filename,"c:\\vsobel.bmp");

		break;

	case TEMPLATE_ISOSOBEL_H:

		coef=(float)1.0;

		memcpy(CoefArray,Template_HIsoSobel,9*sizeof(float));

		strcpy(filename,"c:\\hisobel.bmp");

		break;

	case TEMPLATE_ISOSOBEL_V:

		coef=(float)1.0;

		memcpy(CoefArray,Template_VIsoSobel,9*sizeof(float));

		strcpy(filename,"c:\\visobel.bmp");

		break;

	}



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



	lpPtr=(char *)lpImgData;

	lpTempPtr=(char *)lpTempImgData;



	memcpy(lpTempPtr,lpPtr,BufSize);



	for(y=1;y<bi.biHeight-1;y++)

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

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

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

				TempNum=(float)((unsigned char)*(lpPtr+LineBytes-1))*CoefArray[0];

				TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*CoefArray[1];

				TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*CoefArray[2];

				TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3];

				TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4];

				TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5];

				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*CoefArray[6];

				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*CoefArray[7];

				TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*CoefArray[8];

				TempNum*=coef;

				if(TempNum>255.0) *lpTempPtr=(BYTE)255;

				else if(TempNum<0.0) 

					*lpTempPtr=(unsigned char)fabs(TempNum);

				else *lpTempPtr=(BYTE)TempNum;

		}



	hDc=GetDC(hWnd);

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



	hf=_lcreat(filename,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 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);

⌨️ 快捷键说明

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