机器视觉入门之路(四,bmp数据的Z倒序处理,c++)

在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);
        }

搞定!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值