看《programming windows》上说,是把它转换成相对应的bmHeight为正的DIB,以便用于SetDIBitsToDevice函数,可是原程序中没有第一步,那是在什么时候转换的?

解决方案 »

  1.   

    CreateDIBSection(..),它不支持负数,应该转换
      

  2.   

    SetDIBitsToDevice支持吗? 看书上用bmHeight为负的DIB时没见它转换呀?
      

  3.   

    如果位图是反的(也就是DIB第一条扫描线是最顶的扫描线),那么,把BITMAPINFOHEADER里的bmiHeader.biHeight设为负,就能正确地SetDIBitsToDevice()来显示..
      

  4.   

    看书上处理bmHeight为负的格式位图的办法是,把它变成bmHeight为正的位图(pBits位都要倒过来),再交给SetDIBitsToDevice处理,但是例子里在SetDIBitsToDevice之前没有转换的动作,所以有些搞不清楚,是不是SetDIBitsToDevice函数负责对bmHeight为负的函数进行了转换? 但是在bmHeight为负的格式出现前SetDIBitsToDevice函数已经有了,难道现在的SetDIBitsToDevice改写过了?
      

  5.   

    它本身就支持镜象显示的.
    不过,即使自己处理,转换一下也只一个循环几句代码罢了:
    =====================================================================
    先把BITMAPINFOHEADER里的bmiHeader.biHeight为正BYTE *pLine = NULL;
    BYTE *pDesLine = NULL;
    BYTE *TempBits = (BYTE *)malloc(bmpBitsSize);//申请个大小相同的位数据空间
    if(!TempBits)
    {
        TRACE0("alloc memory error\n");
        return;
    }
    WORD m_nBytePerLine = (bmpLineSize);
    WORD Q = bmiHeader.biHeight - 1;for(WORD i=0;i< bmiHeader.biheight;++i)
    {
        pLine = &((BYTE)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行
        pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行
        memcpy(pDesLine,pLine,m_nBytePerLine);
        Q--;
    }
    memcpy(pBits,TempBits,bmpBitsSize);//copy回去
    GdiFlush();
    ===============================================================
    那么改为正的bmHeight就能SetDIBitsToDevice()正常显示
      

  6.   

    手快快,写错了几个  >_<
    应为:
    for(WORD i=0;i< bmiHeader.biHeight;++i)
    {
        pLine = &((BYTE *)pBits)[i*m_nBytePerLine];//指向第一扫描线在顶的“反转图”的第一行
        pDesLine = &(TempBits)[Q*m_nBytePerLine];//指向临时位数据最第行
        memcpy(pDesLine,pLine,m_nBytePerLine);
        Q--;
    }
      

  7.   

    倒。。
    漏了.....free(TempBits)....kakaka..漏这错那又3帖ing(汗)
    灌得开心..水饺去也~~~         ^00^