正在做一个图像处理的类库,任意图像类型的文件利用类库读入后都存为一个固定的格式,保证程序的可扩展性。在编写的过程中需要将图像显示到屏幕上,由于自己写的将图像所有像素绘制到CDC上的程序速度总不是很理想,因此想到了一个很经典的类——CBitmap类。以下是程序中实现显示到场景的方法。
其中pDC为类的成员变量,在拷贝构造函数中已经赋值。IMAGEBITS结构是自定义的图像结构体,包含4个BYTE成员,分别表示红色分量、绿色分量、蓝色分量、保留位。该IMAGEBITS中像素顺序统一为BMP图像文件顺序。
void CWindowGraph::SetImage(int nX,int nY,long nHeight,long nWidth,IMAGEBITS *pstBits)
{
CBitmap m_Bitmap;
long nSize=nWidth*nHeight*4;
BYTE *pbBits=new BYTE[nSize];
CDC *pMemDC=new CDC;
long i=0,nCount=nSize/4;
for (i=0;i<nSize;i+=4) { //将Bmp文件序列变换为显示序列
nCount--;
pbBits[i]=pstBits[nCount].c_R;
pbBits[i+1]=pstBits[nCount].c_G;
pbBits[i+2]=pstBits[nCount].c_B;
pbBits[i+3]=pstBits[nCount].c_Flag;
}
m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
m_Bitmap.SetBitmapBits(nSize,pbBits);
pMemDC->CreateCompatibleDC(pDC);
pMemDC->SelectObject(&m_Bitmap);
pDC->BitBlt(nX,nY,nWidth,nHeight,pMemDC,0,0,SRCCOPY);
return ;
}
图像显示效果如下: