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

📄 dib.cpp

📁 有空可以去看下哟,还可以
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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);
}

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;

}

//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);

}

BYTE CDib::GetBitCount() const
{
	return m_nBitCount;
}

BITMAPINFO* CDib::GetBmpInfo() const
{
    return m_pBitmapInfo;
}

BYTE* CDib::GetDibData() const
{
    return m_pDibData;
}

RGBQUAD* CDib::GetRGBQuad() const
{
    return m_pRGBQuad;
}

⌨️ 快捷键说明

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