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

📄 imageobject.cpp

📁 分水岭算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	::GlobalUnlock(handle);
    ::GlobalUnlock(hDib); 
	SetDib(hDib);

	return(TRUE);
}


/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:GetPixelColor
* 
*  参数:  int x    -- 图象的横坐标   
*            int y    -- 图象的纵坐标
* 
*  返回值:  RGBQUAD  -- 点(x,y)处对应的RGBQUAD结构的象素值 
*
*  说明:    该函数用于获取(x,y)处的象素值,
*            被LoadDIBToBuf()所调用或者单独使用          
************************************************************************/

RGBQUAD CImageObject::GetPixelColor(int x,int y)
{
	RGBQUAD rgb;
	rgb.rgbBlue = rgb.rgbGreen = rgb.rgbRed = rgb.rgbReserved = 0;
    if(m_pDib == NULL)
		return rgb;

    y = m_nHeight -1 - y;  // add by maple,2004.5.14
	
	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);
    
	if (m_nColors)
	{   
		BYTE tmp;
		tmp = GetPixelIndex(x,y);
	    rgb = GetPaletteColor(tmp);
	} 
	else
	{
		BYTE* iDst  = pBits + y*GetWidthInBytes(m_nBits,m_nWidth) + x*3;
		rgb.rgbBlue = *iDst++;
		rgb.rgbGreen= *iDst++;
		rgb.rgbRed  = *iDst;
    	rgb.rgbReserved =(BYTE) 0;
	}

	return rgb;
}



/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:GetPaletteColor
* 
*  参数:  BYTE idx -- 调色板中对应的下标 值
* 
*  返回值:  RGBQUAD  -- 点(x,y)处对应的RGBQUAD结构的象素值 
*
*  说明:    该函数用于调色板中下标 idx 对应的RGBQUAD,被 GetPixelColor()调用        
************************************************************************/

RGBQUAD CImageObject::GetPaletteColor(BYTE idx)
{
	RGBQUAD rgb = {0,0,0,0};
	
	if ((m_pDib)&&(m_nColors))
	{
		BYTE* iDst = (BYTE*)(m_pDib +sizeof(BITMAPFILEHEADER)
			         +sizeof(BITMAPINFOHEADER));
		if (idx<m_nColors)
		{
			long ldx=idx*sizeof(RGBQUAD);
			rgb.rgbBlue = iDst[ldx++];
			rgb.rgbGreen=iDst[ldx++];
			rgb.rgbRed =iDst[ldx++];
			rgb.rgbReserved = iDst[ldx];
		}
	}

	return rgb;
}

/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:GetPixelIndex
* 
*  参数:  int x    -- 横坐标
*            int y    -- 纵坐标
* 
*  返回值:  BYTE     -- 点(x,y)的象素值在调色板中的下标
*
*  说明:    该函数用于获取(x,y)的象素值在调色板中的下标。
*            被函数 GetPaletteColor()所调用       
************************************************************************/

BYTE CImageObject::GetPixelIndex(int x,int y)
{

    if ((m_pDib==NULL)||(m_nColors==0)) return 0;

	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);
	   
	if (m_nBits==8)
	{
		return (BYTE)*(pBits+y*GetWidthInBytes(m_nBits,m_nWidth)+x);
	}
	else 
	{
		BYTE pos;
		BYTE iDst= (BYTE)*(pBits+y*GetWidthInBytes(m_nBits,m_nWidth)+(x*m_nBits >> 3));
		if (m_nBits==4)
		{
			pos = (BYTE)(4*(1-x%2));
			iDst &= (0x0F<<pos);
			return (BYTE)(iDst >> pos);
		} 
		else if (m_nBits==1)
		{
			pos = (BYTE)(7-x%8);
			iDst &= (0x01<<pos);
			
			return (BYTE)(iDst >> pos);
		}
	}
	   
	return 0;
}


/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:SetPixelColor
* 
*  参数:  int x            -- 横坐标
*            int y            -- 纵坐标
*            RGBQUAD  color   -- RGBQUAD结构的调色板象素值
* 
*  返回值:  void     
*
*  说明:    该函数用color中对应的象素值代替(x,y)对应的象素值 
*            被函数UpdateDIB(所调用
************************************************************************/

void CImageObject:: SetPixelColor(int x,int y,RGBQUAD color)
{
    if ((m_pDib==NULL)||(x<0)||(y<0)||
		  (x>=m_nWidth)||(y>=m_nHeight)) 
	return;

	y = m_nHeight -1 - y;   // add by maple, 2004.5.14
	
	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);

	if (m_nColors)
		SetPixelIndex(x,y,GetNearestIndex(color));
	else 
	{
		BYTE* iDst = pBits + y*GetWidthInBytes(m_nBits,m_nWidth) + x*3;
		*iDst++ = color.rgbBlue;
		*iDst++ = color.rgbGreen;
		*iDst   = color.rgbRed;
	}
}



/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:SetPixelIndex
* 
*  参数:  int x            -- 横坐标
*            int y            -- 纵坐标
*            BYTE index       -- (x,y)中象素值所对应的在调色板中的下标
* 
*  返回值:  void     
*
*  说明:    该函数用下标index来替换原DIB中的索引
*            被函数SetPixelColor()所调用
************************************************************************/

void CImageObject::SetPixelIndex(int x,int y,BYTE index)
{

	if ((m_pDib==NULL)||(m_nColors==0)||
		(x<0)||(y<0)||(x>=m_nWidth)||(y>=m_nHeight)) return ;

	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);
	
	if (m_nBits==8)
	{
	    *(pBits+y*GetWidthInBytes(m_nBits,m_nWidth) + x)=index;
		return;
	} 
	else 
	{
		BYTE pos;
		BYTE* iDst= pBits + y*GetWidthInBytes(m_nBits,m_nWidth) + (x*m_nBits >> 3);
		if (m_nBits==4)
		{
			pos = (BYTE)(4*(1-x%2));
			*iDst &= ~(0x0F<<pos);
			*iDst |= ((index & 0x0F)<<pos);
			return;
		} 
		else if (m_nBits==1)
		{
			pos = (BYTE)(7-x%8);
			*iDst &= ~(0x01<<pos);
			*iDst |= ((index & 0x01)<<pos);
			return;
		}
	}	
}


/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:GetNearestIndex
* 
*  参数:  RGBQUAD color  -- 调色板的一个单元结构
*
*  返回值:  BYTE           -- 输入调色板单元所对应的索引
*
*  说明:    该函数用来得到输入调色板单元所对应的索引,
*            它作为函数 SetPixelIndex()的一个参数被调用。
************************************************************************/

BYTE CImageObject::GetNearestIndex(RGBQUAD color)
{

	if ((m_pDib==NULL)||(m_nColors==0)) return 0;

	BYTE* iDst = m_pDib+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	long distance=200000;
	int i,j=0;
	long k,l;

	for(i=0,l=0;i<m_nColors;i++,l+=sizeof(RGBQUAD))
	{
		k = (iDst[l]-color.rgbBlue)*(iDst[l]-color.rgbBlue)+
			(iDst[l+1]-color.rgbGreen)*(iDst[l+1]-color.rgbGreen)+
			(iDst[l+2]-color.rgbRed)*(iDst[l+2]-color.rgbRed);
//		k = abs(iDst[l]-c.rgbBlue)+abs(iDst[l+1]-c.rgbGreen)+abs(iDst[l+2]-c.rgbRed);
		if (k==0)
		{
			j=i;
			break;
		}
		if (k<distance){
			distance=k;
			j=i;
		}
	} 
	
	return (BYTE)j;
}

////////////////////////////////////////////////////////////////////////
//  以下四个函数专用于256色灰度图象
////////////////////////////////////////////////////////////////////////

/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:LoadDIBTOBuf2
* 
*  参数:  BYTE * buf   --  传入的用于放置象素值的区域的指针 
*   
*  返回值:  bool
*
*  说明:    该函数专用于256色灰度图象,DIB中对应的象素值转移到m_buf中,
*            每个点的象素值占一个字节。        
************************************************************************/

bool CImageObject::LoadDIBToBuf2(BYTE * buf)
{
	if(m_hDib == NULL)
		return false;
	if(m_pDib)
		m_pDib = (BYTE *)::GlobalUnlock(m_hDib);
	m_pDib = (BYTE *)::GlobalLock(m_hDib);

	if(m_pDib!=NULL)
	{
		int nWidthInBytes = GetWidthInBytes(m_nBits,m_nWidth);
		for( int j=0; j<m_nHeight; j++)
			for(int i=0; i<m_nWidth; i++) 
			{
			   *(buf+j*m_nWidth+i) = GetPixelColor2(i,j);
			}
	}

	::GlobalUnlock(m_hDib);
 
	return true;		
}



/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:UpdateDIB2
* 
*  参数:  int nNewWidth    -- 图象经过处理后新的宽度   
*            int nNewHeight   -- 图象经过处理后新的高度
* 
*  返回值:  bool
*
*  说明:    更新256灰度图象的DIB 
*            该函数用处理后的buf中的象素值来更新DIB,
*            并根据传入的新的高度和宽度来决定是否新建一DIB。            
************************************************************************/

bool CImageObject::UpdateDIB2(int nNewWidth,int nNewHeight,BYTE * buf)
{
    // if the size of the image has no change,
	// we only need to update the old DIB.

	if(nNewWidth == m_nWidth && nNewHeight == m_nHeight)
	{
 	    if(m_pDib!=NULL)
		    ::GlobalUnlock(m_hDib);
	    m_pDib = (BYTE *)::GlobalLock(m_hDib);

	    if(m_pDib!=NULL)
		{
			BYTE color;
    	    for( int j=0; j<m_nHeight; j++)
		        for( int i=0; i<m_nWidth; i++)
				{   
                   color = *(buf+j*m_nWidth+i);
		    	   SetPixelColor2( i, j, color ) ;
				} 
		    ::GlobalUnlock(m_hDib);
			return(true);
		}
		else
		{
		    ::GlobalUnlock(m_hDib);
			return(false);
		}


	}
	// the size of the image has been changed
	// we must create a new DIb to replace the old one.
	else   
	{
		HGLOBAL hNewDib;
		DWORD dwNewSize;
		BYTE * pNewBuf;
		BYTE * pNewBits;
		BITMAPFILEHEADER *pOldBFH,*pNewBFH;
		BITMAPINFOHEADER *pOldBIH,*pNewBIH;
		RGBQUAD *pOldPalette,*pNewPalette;

	    if(m_pDib!=NULL)
		    ::GlobalUnlock(m_hDib);
	    m_pDib = (BYTE *)::GlobalLock(m_hDib);
		if(m_pDib==NULL)
		{
			::GlobalUnlock(m_hDib);
			return(false);
		}

		dwNewSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
			     +m_nColors*sizeof(RGBQUAD)+GetWidthInBytes(m_nBits,nNewWidth)*nNewHeight;
		hNewDib = :: GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwNewSize);
		if(hNewDib==NULL)
		{
			::GlobalUnlock(m_hDib);
			return (false);
		}

		pNewBuf = (BYTE *)::GlobalLock(hNewDib);
		if(pNewBuf==NULL)
		{
            ::GlobalFree(hNewDib);
			::GlobalUnlock(m_hDib);
			return (false);
		}
   
		pOldBFH = (BITMAPFILEHEADER *)m_pDib;
		pOldBIH = (BITMAPINFOHEADER *)(m_pDib+sizeof(BITMAPFILEHEADER));
		pOldPalette = (RGBQUAD *)(m_pDib+sizeof(BITMAPFILEHEADER)+
			                   sizeof(BITMAPINFOHEADER));
		
		pNewBFH = (BITMAPFILEHEADER *) pNewBuf;
		pNewBIH = (BITMAPINFOHEADER *) (pNewBuf+sizeof(BITMAPFILEHEADER));
		pNewPalette = (RGBQUAD *)(pNewBuf+sizeof(BITMAPFILEHEADER)+
			                   sizeof(BITMAPINFOHEADER));
		pNewBits = pNewBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
			       +m_nColors*sizeof(RGBQUAD);

		*pNewBFH = *pOldBFH;
		*pNewBIH = *pOldBIH; 
        pNewBFH->bfSize = dwNewSize;
		pNewBIH->biWidth = (LONG)nNewWidth;
		pNewBIH->biHeight = (LONG)nNewHeight;
		pNewBIH->biSizeImage = (DWORD)GetWidthInBytes(m_nBits,nNewWidth)*nNewHeight;
  
		for(int k=0;k<m_nColors;k++)
            pNewPalette[k] = pOldPalette[k];
 
		// very important!!
        // if we miss the following two lines,the display of the image
  		m_nWidth = nNewWidth;         
		m_nHeight = nNewHeight; 
		
        m_nPlanes = pNewBIH->biPlanes;      
		m_nBits = pNewBIH->biBitCount;
		m_nColors = pNewBIH->biClrUsed;
		m_nPaletteInBytes = m_nColors*sizeof(RGBQUAD);
		
		
		// will be wrong!
		::GlobalUnlock(m_hDib);
		::GlobalFree(m_hDib);
		::GlobalUnlock(hNewDib);
		SetDib(hNewDib);
       		
	    if(m_pDib)
		    m_pDib = (BYTE *)::GlobalUnlock(m_hDib);
	    m_pDib = (BYTE *)::GlobalLock(m_hDib);

	    if(m_pDib!=NULL)
		{
    	    BYTE color;
			for( int j=0; j<m_nHeight; j++)
		        for( int i=0; i<m_nWidth; i++)
				{  
					color = *(buf+j*m_nWidth+i);
		    	    SetPixelColor2( i, j, color ) ;
				} 
	        ::GlobalUnlock(m_hDib);
     	    return TRUE;
		}
		else
		{
			::GlobalUnlock(m_hDib);
			return(false);
		}
	}

}

/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:GetPixelColor2
* 
*  参数:  int x    -- 图象的横坐标   
*            int y    -- 图象的纵坐标
* 
*  返回值:  RGBQUAD  -- 点(x,y)处对应的RGBQUAD结构的象素值 
*
*  说明: 此函数专用于256色灰度图象,用于获取(x,y)处的象素值,   
*         被LoadDIBToBuf()所调用或者单独使用   
************************************************************************/
BYTE CImageObject::GetPixelColor2(int x,int y)
{
    if(m_pDib == NULL)
		return (BYTE)0;
   
	y = m_nHeight -1 - y;   // add by maple, 2004.5.14
	
	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);
	BYTE tmpColor;
	    tmpColor = * (pBits + y*GetWidthInBytes(m_nBits,m_nWidth) + x);
	return tmpColor;

}


/***********************************************************************
*  Description: this function was added by maple,2004.3.18
*
*  函数名称:SetPixelColor2
* 
*  参数:  int x            -- 横坐标
*            int y            -- 纵坐标
*            BYTE  color      -- 指定坐标对应的象素值  
* 
*  返回值:  void     
*
*  说明:    该函数专用于256色灰度图象, 
*            用color中对应的象素值代替(x,y)对应的象素值, 
*            被函数UpdateDIB(所调用或者单独使用。
************************************************************************/

void CImageObject:: SetPixelColor2(int x,int y,BYTE color)
{
    if ((m_pDib==NULL)||(x<0)||(y<0)||
		  (x>=m_nWidth)||(y>=m_nHeight)) 
	return;
    
    y = m_nHeight -1 - y;   // add by maple, 2004.5.14

	BYTE * pBits = m_pDib + sizeof(BITMAPFILEHEADER)
		+ sizeof(BITMAPINFOHEADER) + m_nColors*sizeof(RGBQUAD);
 
	*(pBits+y*GetWidthInBytes(m_nBits,m_nWidth) + x) = color;		
}

/***********************************************************************
*  Description: this function was added by maple,2004.4.16
*
*  函数名称:SaveBMP()
*
*  参数:    const char * strPathName   -- 文件保存名
*            HGLOBAL hDib               -- 位图句柄
*
*  返回值:  BOOL
*
*  说明:   该函数用于代替 imageload.dll中的保存BMP的函数
************************************************************************/

BOOL CImageObject::SaveBMP(const char * strPathName, HGLOBAL hDib )
{
    if(hDib == NULL)
		return FALSE;
	BYTE * pDib;
	pDib = (BYTE *)::GlobalLock(hDib);
	if(pDib == NULL)
		return FALSE;

	// 得到文件长度
	long filelength = (long)::GlobalSize(hDib);
	CFile file(strPathName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
   
	// 往文件里写图象数据
	file.Write(pDib,filelength);
	file.Close();

	::GlobalUnlock(hDib);
  
	return TRUE;	
}

⌨️ 快捷键说明

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