📄 dib.cpp
字号:
}
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 1)
else if(m_nBitCount == 4)
{
//每行实际字节数
LONG nLineBytes = (m_nWidth + 1) / 2;
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 24位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 24位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb24 + dwDdbBaseIndex;
for(LONG j = 0;j < nLineBytes;j++)
{
//两个像素数据的索引值, 通过高四位和低四位
BYTE byBit8 = *(pbyDibRaw++);
BYTE byBitHigh = (byBit8 & 0xF0) >> 4;
BYTE byBitLow = (byBit8 & 0x0F);
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbRed; //红色
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbRed; //红色
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 4)
else if(m_nBitCount == 8)
{
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 24位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 24位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb24 + dwDdbBaseIndex;
for(LONG j = 0;j < m_nWidth;j++)
{
//一个像素数据的索引值
BYTE byIndex = *(pbyDibRaw++);
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbRed; //红色
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 8)
else if(m_nBitCount == 24)
{
DWORD dwLength = m_nWidth * 3;
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + (m_nHeight - 1) * dwDibWidthBytes;;
//指向 DDB 24位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb24;
//蓝色--绿色--红色
for(LONG i = 0;i < m_nHeight;i++)
{
::CopyMemory(pbyDdbRaw, pbyDibRaw, dwLength);
pbyDibRaw -= dwDibWidthBytes; //from
pbyDdbRaw += dwDdbWidthBytes; //to
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 24)
return (m_nWidth * m_nHeight);
}
//将所有格式的数据转换成DDB--32位数据, 存放于lpbyDdb32
//返回获取数据的总数.
//32位DDB数据按字节顺序:蓝色--绿色--红色--保留字节--
DWORD CDib::GetDdbData32(LPBYTE lpbyDdb32)
{
ASSERT(lpbyDdb32);
//计算DIB位图中一行的字节量
DWORD dwDibWidthBytes = GetDibWidthBytes(m_nWidth, m_nBitCount);
//转换成32位DDB后每行的大小, 注意每位4字节
DWORD dwDdbWidthBytes = m_nWidth * 4;
if(m_nBitCount == 1)
{
//每行实际字节数, 8个像素对应一个字节.
LONG nLineBytes = (m_nWidth + 7) / 8;
BYTE abyBitMask[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 32位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 32位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
for(LONG j = 0;j < nLineBytes;j++)
{
//8个像素数据的索引值
BYTE byBit8 = *(pbyDibRaw++);
for(int n = 0; n < 8;n++)
{
BYTE byBitSingle = (byBit8 & abyBitMask[n]) >> (7 - n);
*(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbRed; //红色
pbyDdbRaw++; //保留**
}
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 1)
else if(m_nBitCount == 4)
{
//每行实际字节数
LONG nLineBytes = (m_nWidth + 1) / 2;
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 32位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 32位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
for(LONG j = 0;j < nLineBytes;j++)
{
//两个像素数据的索引值, 通过高四位和低四位
BYTE byBit8 = *(pbyDibRaw++);
BYTE byBitHigh = (byBit8 & 0xF0) >> 4;
BYTE byBitLow = (byBit8 & 0x0F);
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbRed; //红色
pbyDdbRaw++;
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbRed; //红色
pbyDdbRaw++;
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 4)
else if(m_nBitCount == 8)
{
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 32位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 32位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
for(LONG j = 0;j < m_nWidth;j++)
{
//一个像素数据的索引值
BYTE byIndex = *(pbyDibRaw++);
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbBlue; //蓝色
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbGreen; //绿色
*(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbRed; //红色
pbyDdbRaw++;
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 8)
else if(m_nBitCount == 24)
{
//DIB位图数据的行头
DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;
//DDB 32位位图数据的行头
DWORD dwDdbBaseIndex = 0;
for(LONG i = 0;i < m_nHeight;i++)
{
//指向DIB行数据的指针
BYTE* pbyDibRaw = m_pDibData + dwDibBaseIndex;
//指向 DDB 32位位图的数据的指针
BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
for(LONG j = 0;j < m_nWidth;j++)
{
*(pbyDdbRaw++) = *(pbyDibRaw++); //蓝色
*(pbyDdbRaw++) = *(pbyDibRaw++); //绿色
*(pbyDdbRaw++) = *(pbyDibRaw++); //红色
pbyDdbRaw++;
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex += dwDdbWidthBytes;
}//end i
return (dwDdbWidthBytes * m_nHeight);
}// end if(m_nBitCount == 24)
return (m_nWidth * m_nHeight);
}
//the return value is the number of scan lines copied.
int CDib::Draw(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, UINT iUsage, DWORD dwRop)
{
if (m_pRGBQuad) // Has a color table
{
HPALETTE hPalette = CreateBitmapPalette();
HPALETTE hOldPalette = ::SelectPalette(hdc, hPalette, FALSE);
::RealizePalette(hdc);
int nScanLines = StretchDIBits(hdc,
XDest, YDest, nDestWidth, nDestHeight,
XSrc, YSrc, nSrcWidth, nSrcHeight,
m_pDibData, m_pBitmapInfo, iUsage, dwRop);
::SelectPalette(hdc, hOldPalette, FALSE);
::DeleteObject(hPalette);
return nScanLines;
}
else
return StretchDIBits(hdc,
XDest, YDest, nDestWidth, nDestHeight,
XSrc, YSrc, nSrcWidth, nSrcHeight,
m_pDibData, m_pBitmapInfo, iUsage, dwRop);
}
HPALETTE CDib::CreateBitmapPalette()
{
if((m_pRGBQuad == NULL) || !IsValid())return NULL;
struct
{
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
} palette = { 0x300, 256 };
LPRGBQUAD pRGBTable = m_pRGBQuad;
for(UINT i = 0; i < m_nTotalColors; ++i)
{
palette.palPalEntry[i].peRed = pRGBTable[i].rgbRed;
palette.palPalEntry[i].peGreen = pRGBTable[i].rgbGreen;
palette.palPalEntry[i].peBlue = pRGBTable[i].rgbBlue;
palette.palPalEntry[i].peFlags = 0;
}
HPALETTE hPalette = ::CreatePalette((LPLOGPALETTE)&palette);
return hPalette;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -