请问如何在使用SetDIBitsToDevice画图时,把图像翻转180度?或如何把指向一个图像的指针的内存块倒置,使该图像在显示时翻转180度?

解决方案 »

  1.   

    PlgBlt可以对图象区域进行仿射变换,参数合适的时候就是旋转180度
      

  2.   

    把图像翻转180度?是指水平镜像或垂直镜像吗?
    我简单说说你需要的第二种方式(书上抄的):
     * 函数名称:
     *   MirrorDIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数)
     *   LONG  lHeight      - 源图像高度(象素数)
     *   BOOL  bDirection   - 镜像的方向,TRUE表示水平镜像,FALSE表示垂直镜像
     *
     * 返回值:
     *   BOOL               - 镜像成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     *   该函数用来镜像DIB图像。可以指定镜像的方式是水平还是垂直。
     *
     ************************************************************************/BOOL WINAPI MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection)
    {

    // 指向源图像的指针
    LPSTR lpSrc;

    // 指向要复制区域的指针
    LPSTR lpDst;

    // 指向复制图像的指针
    LPSTR lpBits;
    HLOCAL hBits; // 循环变量
    LONG i;
    LONG j;

    // 图像每行的字节数
    LONG lLineBytes;

    // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8);

    // 暂时分配内存,以保存一行图像
    hBits = LocalAlloc(LHND, lLineBytes);
    if (hBits == NULL)
    {
    // 分配内存失败
    return FALSE;
    }

    // 锁定内存
    lpBits = (char * )LocalLock(hBits);

    // 判断镜像方式
    if (bDirection)
    {
    // 水平镜像

    // 针对图像每行进行操作
    for(i = 0; i < lHeight; i++)
    {
    // 针对每行图像左半部分进行操作
    for(j = 0; j < lWidth / 2; j++)
    {

    // 指向倒数第i行,第j个象素的指针
    lpSrc = (char *)lpDIBBits + lLineBytes * i + j;

    // 指向倒数第i行,倒数第j个象素的指针
    lpDst = (char *)lpDIBBits + lLineBytes * (i + 1) - j;

    // 备份一个象素
    *lpBits = *lpDst;

    // 将倒数第i行,第j个象素复制到倒数第i行,倒数第j个象素
    *lpDst = *lpSrc;

    // 将倒数第i行,倒数第j个象素复制到倒数第i行,第j个象素
    *lpSrc = *lpBits;
    }

    }
    }
    else
    {
    // 垂直镜像 // 针对上半图像进行操作
    for(i = 0; i < lHeight / 2; i++)
    {

    // 指向倒数第i行象素起点的指针
    lpSrc = (char *)lpDIBBits + lLineBytes * i;

    // 指向第i行象素起点的指针
    lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);

    // 备份一行,宽度为lWidth
    memcpy(lpBits, lpDst, lLineBytes);

    // 将倒数第i行象素复制到第i行
    memcpy(lpDst, lpSrc, lLineBytes);

    // 将第i行象素复制到倒数第i行
    memcpy(lpSrc, lpBits, lLineBytes);

    }
    }

    // 释放内存
    LocalUnlock(hBits);
    LocalFree(hBits);

    // 返回
    return TRUE;
    }