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

📄 dibapi.cpp

📁 数字图像处理的灰度处理源代码.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//DIBAPI.cpp

#include "stdafx.h"
#include "DIBAPI.h"
#include "math.h"

WORD WINAPI DIBNumColors(LPSTR lpbi)
{
	WORD wBitCount;

	if(IS_WIN30_DIB(lpbi))
	{
		DWORD dwClrUsed;
		dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;

		if(dwClrUsed)
			return (WORD)dwClrUsed;
	}

	if(IS_WIN30_DIB(lpbi))
        wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;
	else
		wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;

	switch(wBitCount)
	{
	case 1:
		return 2;
	case 4:
		return 16;
	case 8:
		return 256;
	default:
		return 0;
	}
}

WORD WINAPI PaletteSize(LPSTR lpbi)
{
	if(IS_WIN30_DIB(lpbi))
		return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));
	else
		return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));
}


LPSTR WINAPI FindDIBBits(LPSTR lpbi)
{
	return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi));
}

DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
	LPBITMAPINFOHEADER lpbmi;
	LPBITMAPCOREHEADER lpbmc;

	lpbmi=(LPBITMAPINFOHEADER)lpDIB;
	lpbmc=(LPBITMAPCOREHEADER)lpDIB;

	if(IS_WIN30_DIB(lpDIB))
		return lpbmi->biWidth;
	else
		return (DWORD)lpbmc->bcWidth;
}

DWORD WINAPI DIBHeight(LPSTR lpDIB)
{
	LPBITMAPINFOHEADER lpbmi;
	LPBITMAPCOREHEADER lpbmc;

	lpbmi=(LPBITMAPINFOHEADER)lpDIB;
	lpbmc=(LPBITMAPCOREHEADER)lpDIB;

	if(IS_WIN30_DIB(lpDIB))
		return lpbmi->biHeight;
	else
		return (DWORD)lpbmc->bcHeight;
}

BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)
{
	LPSTR lpDIBHdr;
	LPSTR lpDIBBits;
	BOOL bSuccess=FALSE;
	HPALETTE hPal=NULL;
	HPALETTE hOldPal=NULL;

	if(hDIB==NULL)
		return FALSE;

	lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
	lpDIBBits=FindDIBBits(lpDIBHdr);

	if(pPal!=NULL)
	{
		hPal=(HPALETTE)pPal->m_hObject;
		hOldPal=::SelectPalette(hDC,hPal,TRUE);
	}

	::SetStretchBltMode(hDC,COLORONCOLOR);

    if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
	{
		bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
		(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\
		lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
	}
	else
	{
		bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
		lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\
		lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
	}

	::GlobalUnlock((HGLOBAL)hDIB);

	if(hOldPal)
		::SelectPalette(hDC,hOldPal,TRUE);

	GlobalUnlock(hDIB);

	return bSuccess;
}

BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)
{
	LPLOGPALETTE lpPal;
	HANDLE hLogPal;
	HPALETTE hPal=NULL;
	LPSTR lpbi;
	LPBITMAPINFO lpbmi;
	LPBITMAPCOREINFO lpbmc;
	BOOL bWinStyleDIB;
	int i;
	WORD wNumColors;
	BOOL bResult=FALSE;

	if(hDIB==NULL)
		return FALSE;
    
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
	lpbmi=(LPBITMAPINFO)lpbi;

	lpbmc=(LPBITMAPCOREINFO)lpbi;

	wNumColors=DIBNumColors(lpbi);

	bWinStyleDIB=IS_WIN30_DIB(lpbi);

	if(wNumColors!=0)
	{
		hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);

		if(hLogPal==0)
		{
			::GlobalUnlock((HGLOBAL)hDIB);
			return FALSE;
		}

		lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);

		lpPal->palVersion=PALVERSION;
		lpPal->palNumEntries=(WORD)wNumColors;
		bWinStyleDIB=IS_WIN30_DIB(lpbi);

		for(i=0;i<(int)wNumColors;i++)
		{
			if(bWinStyleDIB)
			{
				lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
				lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
				lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;
				lpPal->palPalEntry[i].peFlags=0;
			}
			else
			{
				lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;
				lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;
				lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;
				lpPal->palPalEntry[i].peFlags=0;
			}
		}

		bResult=pPal->CreatePalette(lpPal);

		::GlobalUnlock((HGLOBAL)hLogPal);
		::GlobalFree((HGLOBAL)hLogPal);
	}

	::GlobalUnlock((HGLOBAL)hDIB);
	return bResult;
}



HGLOBAL WINAPI CopyHandle(HGLOBAL h)
{
	if(h==NULL)
		return NULL;

	DWORD dwLen=::GlobalSize((HGLOBAL)h);

	HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);

	if(hCopy!=NULL)
	{
		void* lpCopy=::GlobalLock((HGLOBAL)hCopy);
		void* lp=::GlobalLock((HGLOBAL)h);

		memcpy(lpCopy,lp,dwLen);

		::GlobalUnlock(hCopy);
		::GlobalUnlock(h);
	}
	return hCopy;
}

BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
{
	BITMAPFILEHEADER bmfHdr;
	LPBITMAPINFOHEADER lpBI;
	DWORD dwDIBSize;

	if(!hDib)
		return FALSE;

	lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);

	if(lpBI==NULL)
		return FALSE;
     
	if(!IS_WIN30_DIB(lpBI))
	{
		::GlobalUnlock((HGLOBAL)hDib);
		return FALSE;
	}


	bmfHdr.bfType=DIB_HEADER_MARKER;

	dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);

	if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
		dwDIBSize+=lpBI->biSizeImage;
	else
	{
		DWORD dwBmBitsSize;
		dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
		dwDIBSize+=dwBmBitsSize;

		lpBI->biSizeImage=dwBmBitsSize;
	}

	bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1=0;
	bmfHdr.bfReserved2=0;

	bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI);

	TRY
	{
		file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
		file.WriteHuge(lpBI,dwDIBSize);
	}
	CATCH(CFileException,e)
	{
		::GlobalUnlock((HGLOBAL)hDib);
		THROW_LAST();
	}
	END_CATCH

	::GlobalUnlock((HGLOBAL)hDib);

	return TRUE;
}

HDIB WINAPI ReadDIBFile(CFile& file)
{
	BITMAPFILEHEADER bmfHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
    LPSTR pDIB;

    dwBitsSize=file.GetLength();

    if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
		return NULL;

	if(bmfHeader.bfType!=DIB_HEADER_MARKER)
		return NULL;

	hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);

	if(hDIB==0)
		return NULL;

	pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

	if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
	{
		::GlobalUnlock((HGLOBAL)hDIB);
		::GlobalFree((HGLOBAL)hDIB);
		return NULL;
	}

	::GlobalUnlock((HGLOBAL)hDIB);

	return hDIB;
}

//在此处输入自己的函数定义


BOOL WINAPI AverFilter(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
	//均值滤波
	unsigned char* lpSrc1,*lpSrc2,*lpSrc3,*lpSrc4,*lpSrc,*lpSrc6,*lpSrc7,*lpSrc8,*lpSrc9;

	LONG i;
	LONG j;

	LONG lLineBytes;

	LONG fTemp;
	LONG fBiex=20;

	lLineBytes=WIDTHBYTES(lWidth*8);

	for(i=1;i<lHeight-1;i++)
	{
		for(j=1;j<lWidth-1;j++)
		{
			lpSrc1=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j-1;
			lpSrc2=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j-1;
			lpSrc3=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j-1;
			lpSrc4=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j;
			lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
			lpSrc6=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j;
			lpSrc7=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j+1;
			lpSrc8=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j+1;
			lpSrc9=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j+1;

			fTemp=(*lpSrc1+*lpSrc2+*lpSrc3+*lpSrc4+*lpSrc6+*lpSrc7+*lpSrc8+*lpSrc9)/8;
			
			if(abs(fTemp-*lpSrc)>=fBiex)
			{
				fTemp=fTemp;
			}
			else
			{
				fTemp=*lpSrc;
			}

			if(fTemp>255)
			{
				*lpSrc=255;
			}
			else if(fTemp<0)
			{
				*lpSrc=0;
			}
			else
			{
				*lpSrc=(unsigned char)(fTemp+0.5);
			}
		}
	}

	return TRUE;
}


BOOL WINAPI REVERSE(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
	unsigned char* lpSrc;

	int i;
	int j;

	LONG lLineBytes;

	LONG fTemp;
	LONG fBiex=20;

	lLineBytes=WIDTHBYTES(lWidth*8);

	for(i=1;i<lHeight-1;i++)
	{
		for(j=1;j<lWidth-1;j++)
		{
			//lpSrc1=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j-1;
			//lpSrc2=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j-1;
			//lpSrc3=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j-1;
	    	//lpSrc4=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j;
			lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
	    	//lpSrc6=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j;
			//lpSrc7=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i-1))+j+1;
	     	//lpSrc8=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j+1;
		    //lpSrc9=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-(i+1))+j+1;

			//fTemp=(*lpSrc1+*lpSrc2+*lpSrc3+*lpSrc4+*lpSrc6+*lpSrc7+*lpSrc8+*lpSrc9)/8;
			 
			fTemp=256-*lpSrc;

			if(abs(fTemp-*lpSrc)>=fBiex)
			{
				fTemp=fTemp;
			}
			else
			{
				fTemp=*lpSrc;
			}

			if(fTemp>255)
			{
				*lpSrc=255;
			}
			else if(fTemp<0)
			{
				*lpSrc=0;
			}
			else
			{
				*lpSrc=(unsigned char)(fTemp+0.5);
			}
		}
	}


	return true;
}

/*************************************************************************   
    *   
    *   函数名称:   
    *       SaltNoiseDIB()   
    *   
    *   参数:   
    *       LPSTR   lpDIBBits         -   指向源DIB图像指针   
    *       LONG     lWidth               -   源图像宽度(象素数,必须是4的倍数)   
    *       LONG     lHeight             -   源图像高度(象素数)   
    *   
    *   返回值:   
    *       BOOL                               -   模糊操作成功返回TRUE,否则返回FALSE。   
    *   
    *   说明:   
    *       该函数用来对DIB图像进行模糊操作。   
    *   
    ************************************************************************/   
    
 BOOL WINAPI SaltNoiseDIB(LPSTR lpDIBBits,LONG lWidth,LONG   lHeight) 
  {   
  //   指向源图像的指针   
  LPSTR lpSrc;   
    
  //循环变量   
  int   i;   
  int   j;   
    
  //   图像每行的字节数   
  LONG   lLineBytes;   
    
  //   计算图像每行的字节数   
  lLineBytes   =   WIDTHBYTES(lWidth   *   8);   
    
  //生成伪随机种子   
  srand((unsigned)time(NULL));   
    
  //在图像中加噪   
  for   (j   =   0;j   <   lHeight   ;j++)   
  {   
  for(i   =   0;i   <   lLineBytes   ;i++)   
  {   
  if(rand()>31500)   
  {   
  //   指向源图像倒数第j行,第i个象素的指针   
  lpSrc   =   (char   *)lpDIBBits   +   lLineBytes   *   j   +   i;   
    
  //图像中当前点置为黑   
  *lpSrc   =   0;   
  }   
  }   
  }   
  //   返回   
  return   true;   
  } 
 BOOL WINAPI GradSharp(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
	//梯度锐化
	unsigned char* lpSrc1,*lpSrc2,*lpSrc;

⌨️ 快捷键说明

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