📄 dib.cpp
字号:
//指向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);
}
#ifdef _DEBUG
void CDib::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}
void CDib::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_pszFileName != NULL);
ASSERT(m_hDIB != 0);
}
#endif
//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;
}
Pix24Bitmap CDib::LoadBitmapIndex(int i,int j)
{
//计算DIB位图中一行的字节量
DWORD dwDibWidthBytes = GetDibWidthBytes(m_nWidth, m_nBitCount);
//转换成24位DDB后每行的大小, 注意每行的字节数只需要是偶数即可
DWORD dwDdbWidthBytes = ((m_nWidth * 24 + 15) / 16) * 2;
Pix24Bitmap Pix24Temp;
Pix24Temp.Blue=0;Pix24Temp.Green=0;Pix24Temp.Red=0;
/*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 24位位图数据的行头
int 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++)
{
//8个像素数据的索引值
BYTE byBit8 = *(pbyDibRaw++);
for(int n = 0; n < 8;n++)
{
BYTE byBitSingle = (byBit8 & abyBitMask[n]) >> (7 - n);
m_nBitmapData24[i][dwDdbBaseIndex].Blue = m_pRGBQuad[byBitSingle].rgbBlue; //蓝色
m_nBitmapData24[i][dwDdbBaseIndex].Green = m_pRGBQuad[byBitSingle].rgbGreen; //绿色
m_nBitmapData24[i][dwDdbBaseIndex].Red = m_pRGBQuad[byBitSingle].rgbRed; //红色
dwDdbBaseIndex=dwDdbBaseIndex+1;
}
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex =0;
}//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);
m_nBitmapData24[i][dwDdbBaseIndex].Blue = m_pRGBQuad[byBitHigh].rgbBlue; //蓝色
m_nBitmapData24[i][dwDdbBaseIndex].Green = m_pRGBQuad[byBitHigh].rgbGreen; //绿色
m_nBitmapData24[i][dwDdbBaseIndex].Red = m_pRGBQuad[byBitHigh].rgbRed; //红色
dwDdbBaseIndex=dwDdbBaseIndex+1;
m_nBitmapData24[i][dwDdbBaseIndex].Blue = m_pRGBQuad[byBitLow].rgbBlue; //蓝色
m_nBitmapData24[i][dwDdbBaseIndex].Green = m_pRGBQuad[byBitLow].rgbGreen; //绿色
m_nBitmapData24[i][dwDdbBaseIndex].Red = m_pRGBQuad[byBitLow].rgbRed; //红色
dwDdbBaseIndex=dwDdbBaseIndex+1;
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex =0;
}//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++);
m_nBitmapData24[i][dwDdbBaseIndex].Blue = m_pRGBQuad[byIndex].rgbBlue; //蓝色
m_nBitmapData24[i][dwDdbBaseIndex].Green = m_pRGBQuad[byIndex].rgbGreen; //绿色
m_nBitmapData24[i][dwDdbBaseIndex].Red = m_pRGBQuad[byIndex].rgbRed; //红色
dwDdbBaseIndex=dwDdbBaseIndex+1;
}//end j
dwDibBaseIndex -= dwDibWidthBytes;
dwDdbBaseIndex =0;
}//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-i-1) * dwDibWidthBytes+j*3;
//指向 DDB 24位位图的数据的指针
//BYTE* pbyDdbRaw = lpbyDdb24;
Pix24Temp.Blue=*(pbyDibRaw++);
Pix24Temp.Green=*(pbyDibRaw++);
Pix24Temp.Red=*(pbyDibRaw++);
return Pix24Temp;
}// end if(m_nBitCount == 24)
return Pix24Temp;
}
void CDib::DrawDib(HDC hDC)
{
HDRAWDIB m_hDrawDib; // 视频函数
CDC dc;
m_hDrawDib=DrawDibOpen();
DrawDibDraw(m_hDrawDib,hDC,0,0,m_nWidth,m_nHeight,m_pBitmapInfoHeader,m_pDibData,
0,0,m_nWidth,m_nHeight,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -