在cdib和gdi+的加持下,我们来处理bmp数据的Z倒序处理:
我们此节解决三个问题,第一,行四位对齐;第二,翻转Z倒序;第三,24位转换32位图像。
第一,声明变量在.h文件中
UINT m_nPicWidth; // 当前编辑图像宽度
UINT m_nPicHeight; // 当前编辑图像高度
BYTE* m_pImageBuffer; // 编辑图像原始像素数组
BYTE* m_pImageTempBuffer; // 处理后的像素数组
第二,确定图像已经加载后,如下初始化变量:
int bpp = this->m_dib.BPP;
m_nPicWidth = this->m_dib.Width;
m_nPicHeight = this->m_dib.Height;
int sizeofbuffer = m_nPicWidth * m_nPicHeight * 4;
m_pImageBuffer = (BYTE *)malloc(this->m_dib.BufferSize);
memcpy(m_pImageBuffer,m_dib.GetBuffer(), this->m_dib.BufferSize);
m_pImageTempBuffer = (BYTE *)malloc(sizeofbuffer);//给32位图像分配空间
第三,翻转z倒序并给32位图像buffer[]
24bit to 32bit;
if (bpp == 24)
{//先处理行4位对齐
int externWidth;
externWidth = m_nPicWidth * 3;
if (externWidth % 4 != 0)
externWidth = 4 - externWidth % 4;
else
externWidth = 0;
int k = 0;
for (int n = m_nPicHeight - 1; n >= 0; n--)
{//Z倒序数据处理,并得到32位数组buffer
for (UINT m = 0; m < m_nPicWidth * 3; m += 3)
{
m_pImageTempBuffer[k] = m_pImageBuffer[n*(m_nPicWidth * 3 + externWidth) + m]; //blue通道
m_pImageTempBuffer[k + 1] = m_pImageBuffer[n*(m_nPicWidth * 3 + externWidth) + m + 1];//green通道
m_pImageTempBuffer[k + 2] = m_pImageBuffer[n*(m_nPicWidth * 3 + externWidth) + m + 2];//red通道
m_pImageTempBuffer[k + 3] = 255;//亮度通道?
k += 4;
}
}
free(m_pImageBuffer);//释放32位数组buffer[]
}
第四,使用前面的gdi+,显示m_pImageTempBuffer:在onpaint函数中
CPaintDC dc(this); // 用于绘制的设备上下文
if (NULL != m_pImageTempBuffer)
{
Graphics graph(dc.m_hDC); ;
Bitmap bitmap(m_nPicWidth, m_nPicHeight ,
m_nPicWidth * 4, PixelFormat32bppRGB, m_pImageTempBuffer);
graph.DrawImage(&bitmap, 0, 0,640,480);
}
搞定!