📄 dibsectionce.cpp
字号:
// Get the pointer to the image bits
LPBYTE pBits = (LPBYTE) ds.dsBm.bmBits;
// Initialize the loop variables
cColors = min( cColors, cEntries );
BYTE OldPalIndex = *pBits;
UINT TestPixelY;
if (ds.dsBmih.biHeight > 0 )
// If button up DIB, pBits points to last row
TestPixelY = ds.dsBm.bmHeight-1;
else
// If top down DIB, pBits points to first row
TestPixelY = 0;
for (UINT iColor = uStartIndex; iColor < cColors; iColor++)
{
COLORREF rgbColor;
// Set the palette index for the test pixel,
// modifying only the bits for one pixel
*pBits = (iColor << (8 - ds.dsBmih.biBitCount)) |
(*pBits & ~wIndexMask);
// now get the resulting color
rgbColor = GetPixel( hdc, 0, TestPixelY );
pColors[iColor - uStartIndex].rgbReserved = 0;
pColors[iColor - uStartIndex].rgbBlue = GetBValue(rgbColor);
pColors[iColor - uStartIndex].rgbRed = GetRValue(rgbColor);
pColors[iColor - uStartIndex].rgbGreen = GetGValue(rgbColor);
}
// Restore the test pixel
*pBits = OldPalIndex;
return cColors;
}
CDC* CDIBSectionCE::GetMemoryDC(CDC* pDC /*=NULL*/, BOOL bSelectPalette /*=TRUE*/)
{
if (!m_bReuseMemDC)
ReleaseMemoryDC(TRUE);
else if (m_MemDC.GetSafeHdc()) // Already created?
{
#ifndef _WIN32_WCE
// Flush the GDI batch queue
GdiFlush();
#endif
return &m_MemDC;
}
// Create a memory DC compatible with the given DC
if (pDC)
m_MemDC.CreateCompatibleDC(pDC);
else
{
HDC hDC = ::GetDC(NULL); // screen DC
if (!hDC) return FALSE;
m_MemDC.CreateCompatibleDC(CDC::FromHandle(hDC));
::ReleaseDC(NULL, hDC);
}
if (!m_MemDC.GetSafeHdc())
return NULL;
// Select in the bitmap
m_hOldBitmap = (HBITMAP) ::SelectObject(m_MemDC.GetSafeHdc(), m_hBitmap);
if (!m_hOldBitmap)
{
m_MemDC.DeleteDC();
return NULL;
}
#ifndef DIBSECTION_NO_PALETTE
// Select in the palette
if (bSelectPalette && UsesPalette(&m_MemDC))
{
// Palette should already have been created - but just in case...
if (!m_Palette.GetSafeHandle())
CreatePalette();
m_pOldPalette = m_MemDC.SelectPalette(&m_Palette, FALSE);
m_MemDC.RealizePalette();
}
else
m_pOldPalette = NULL;
#endif // DIBSECTION_NO_PALETTE
#ifndef _WIN32_WCE
// Flush the GDI batch queue
GdiFlush();
#endif // _WIN32_WCE
return &m_MemDC;
}
BOOL CDIBSectionCE::ReleaseMemoryDC(BOOL bForceRelease /*=FALSE*/)
{
if ( !m_MemDC.GetSafeHdc() || (m_bReuseMemDC && !bForceRelease) )
return TRUE; // Nothing to do
#ifndef _WIN32_WCE
// Flush the GDI batch queue
GdiFlush();
#endif // _WIN32_WCE
// Select out the current bitmap
if (m_hOldBitmap)
::SelectObject(m_MemDC.GetSafeHdc(), m_hOldBitmap);
m_hOldBitmap = NULL;
#ifndef DIBSECTION_NO_PALETTE
// Select out the current palette
if (m_pOldPalette)
m_MemDC.SelectPalette(m_pOldPalette, FALSE);
m_pOldPalette = NULL;
#endif // DIBSECTION_NO_PALETTE
// Delete the memory DC
return m_MemDC.DeleteDC();
}
#ifdef _DEBUG
// Makes trace windows a little bit more informative...
void CDIBSectionCE::_ShowLastError()
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
TRACE1("Last error: %s\n", lpMsgBuf);
LocalFree(lpMsgBuf);
}
#else
void CDIBSectionCE::_ShowLastError() {}
#endif
//----------------------------------------------------
DWORD CDIBSectionCE::GetColor(int nIndex )
{
if((nIndex <0)||(nIndex >255))
return 0L;
if(nIndex == 0)
return 0L;
BYTE R = m_DIBinfo.arColors[nIndex-1].rgbRed;
BYTE G = m_DIBinfo.arColors[nIndex-1].rgbGreen;
BYTE B = m_DIBinfo.arColors[nIndex-1].rgbBlue ;
return (DWORD)(RGB(R,G,B));
}
//------------------------------------------------------
BOOL CDIBSectionCE::BI_RLE8Processor(HDC hDC,BYTE *pBytes,int nLen,BYTE *pOutBytes,int nWidth)
{
int nIterator = 0;
BYTE letter;
BYTE letter2;
int nLine = 0;
int nColume = 0;
while( nIterator < nLen)
{
letter = pBytes[nIterator];//read
if(letter == 0x00)// Tag 00
{
nIterator ++;
if(nIterator >= nLen)
return FALSE;
letter2 = pBytes[nIterator];
switch(letter2)
{
case 0x00:
TRACE(L"\n行结束,line = %d, Column = %d",nLine,nColume);
nLine++;//行结束
nColume = 0;
break;
case 0x01:
TRACE(L"\n图像结束");
return TRUE;//图像结束
break;
case 0x02:
nIterator ++;
nIterator ++;
if(nIterator >= nLen)
return FALSE;
nColume += pBytes[nIterator-1];
nLine += pBytes[nIterator];
TRACE(L"\n位置移动,行移%d,列移%d,Line = %d,Colum = %d",pBytes[nIterator-1],pBytes[nIterator],nLine,nColume);
//从当前位置右移pBytes[nIterator-1]个位置后向下移pBytes[nIterator]行
break;
default:
letter = letter2;//pBytes[nIterator];//读入数据长度
if(((int)(letter&0x00ff) +nIterator) >= nLen)
return FALSE;
TRACE(L"\n");
for(int i = 0 ;i<(int)((letter&0x00ff));i++)
{
nIterator++;
letter2 = pBytes[nIterator];
TRACE(L" %X",letter2);
//SetPixel(hDC,nColume,nLine,GetColor(letter2));
pOutBytes[nLine*nWidth +nColume] = letter2;
nColume++;
}
if(((int)((letter&0x00ff))%2) != 0)//word boundary
{
//nColume++;
nIterator++;
}
break;
}
}else
{
//letter 为点的个数
//读入颜色索引
nIterator ++;
if(nIterator >= nLen)
return FALSE;
letter2 = pBytes[nIterator];
TRACE(L"\n");
for(int i = 0;i<(int)(letter &0x00FF);i++)
{
TRACE(L" %X",letter2);
//SetPixel(hDC,nColume,nLine,GetColor(letter2));
pOutBytes[nLine*nWidth +nColume] = letter2;
nColume++;
}
}//end of else
nIterator++;
}//end of while
TRACE(L"\n Line = %d",nLine);
TRACE(L"\n Colume = %d",nColume);
return TRUE;
}
//----------------------------------------------------
BOOL CDIBSectionCE::BI_RLE4Processor(HDC hDC,BYTE *pBytes,int nLen,BYTE *pOutBytes,int nWidth)
{
int nIterator = 0;
BYTE letter;
BYTE letter2;
BYTE letterKeep = 0;//字符缓冲器只存半个字节数目的数据,= 0 表示无存储,<> 0 有存储数据
BOOL letterHasKeep = FALSE;
int nLine = 0;
int nColume =0;
while( nIterator < nLen)
{
letter = pBytes[nIterator];//read
if(letter == 0x00)// Tag 00
{
nIterator ++;
if(nIterator >= nLen)
return FALSE;
letter2 = pBytes[nIterator];
switch(letter2)
{
case 0x00:
TRACE(L"\n行结束,line = %d, Colum = %d",nLine,nColume);
nLine++;//行结束
nColume = 0;
break;
case 0x01:
TRACE(L"\n图像结束");
return TRUE;//图像结束
break;
case 0x02:
nIterator ++;
nIterator ++;
if(nIterator >= nLen)
return FALSE;
nColume += pBytes[nIterator-1];
nLine += pBytes[nIterator];
TRACE(L"\n位置移动,行移%d,列移%d,Line = %d,Colum = %d",pBytes[nIterator-1],pBytes[nIterator],nLine,nColume);
//从当前位置右移pBytes[nIterator-1]个位置后向下移pBytes[nIterator]行
//::MoveTo(hDC,nLine,nColum);
break;
default:
letter = letter2;//pBytes[nIterator];//读入数据长度
if(((int)(letter&0x00ff) +nIterator) >= nLen)
return FALSE;
BYTE byHigh,byLow;
TRACE(L"\n");
for(int i = 0 ;i<(int)((letter&0x00ff)/2);i++)
{
nIterator++;
letter2 = pBytes[nIterator];
byHigh = (BYTE)(letter2>>4 & 0x0F);
//TRACE(L" %d",byHigh);
//SetPixel(hDC,nColume/2,nLine,GetColor(byHigh));
//pOutBytes[nLine*nWidth +nColume] = letter2;
if(letterHasKeep == FALSE)
{
letterKeep = byHigh;
letterHasKeep = TRUE;
}
else
{
letterKeep = (letterKeep<<4) +byHigh;
pOutBytes[nLine*nWidth +nColume] = letterKeep;
TRACE(L" %d",letterKeep);
nColume++;
letterHasKeep = FALSE;
}
byLow = (BYTE)(letter2 & 0x0F);
//SetPixel(hDC,nColume/2,nLine,GetColor(byLow));
if(letterHasKeep == FALSE)
{
letterKeep = byLow;
letterHasKeep = TRUE;
}
else
{
letterKeep = (letterKeep<<4) +byLow;
pOutBytes[nLine*nWidth +nColume] = letterKeep;
TRACE(L" %d",letterKeep);
nColume++;
letterHasKeep = FALSE;
}
}
if(((int)((letter&0x00ff)/2)%2) != 0)//word boundary
{
nIterator++;
//nColume ++;
}
break;
}
}else
{
//letter 为点的个数
//读入颜色索引
nIterator ++;
if(nIterator >= nLen)
return FALSE;
letter2 = pBytes[nIterator];
BYTE byHigh,byLow;
byHigh = (BYTE)(letter2>>4 & 0x0F);
byLow = (BYTE)(letter2 & 0x0F);
TRACE(L"\n");
for(int i = 0;i<(int)(letter &0x00FF);i++)
{
if(i%2)
{
//byhigh
//TRACE(L" %d",byLow);
//SetPixel(hDC,nColume/2,nLine,GetColor(byLow));
//
if(letterHasKeep == FALSE)
{
letterKeep = byHigh;
letterHasKeep = TRUE;
}
else
{
letterKeep = (letterKeep<<4) +byHigh;
pOutBytes[nLine*nWidth +nColume] = letterKeep;
TRACE(L" %d",letterKeep);
nColume++;
letterHasKeep = FALSE;
}
}else
{
//low
//SetPixel(hDC,nColume/2,nLine,GetColor(byHigh));
//
if(letterHasKeep == FALSE)
{
letterKeep = byLow;
letterHasKeep = TRUE;
}
else
{
letterKeep = (letterKeep<<4) +byLow;
pOutBytes[nLine*nWidth +nColume] = letterKeep;
TRACE(L" %d",letterKeep);
nColume++;
letterHasKeep = FALSE;
}
//
}//
}//end of for
}//end of else
nIterator++;
}//end of while
TRACE(L"\n Line = %d",nLine);
TRACE(L"\n Colume = %d",nColume);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -