📄 imageobject.cpp
字号:
::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 + -