zoukankan      html  css  js  c++  java
  • Invert (mirror) a bitmap

    http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743/Rotate-a-bitmap-image.htm

    Rotate a bitmap image

    http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1725/Invert-mirror-a-bitmap.htm

    Invert (mirror) a bitmap

    Posted by Zafir Anjum on August 5th, 1998

    We can invert an image either laterally or vertically. The effect of the inversions is shown in the image below. The image on the top left is the normal image, the image on the top right is laterally inverted, the image on the bottom left is vertically inverted and the image on the bottom right has been inverted twice - once laterally and once vertically. The effect of applying both kinds of inversion is that the image gets rotated by 180 degrees.

    Two functions have been listed below, one of them will draw the image onto a device context after inverting it and the other will create a new bitmap with the inverted image.

    Function 1: DrawInvertedBitmap

    The DrawInvertedBitmap() function draws an inverted image of a bitmap at the specified location. It uses StretchBlt() to do the actual inversion. When the signs of the source width and the destination width are different then the image is inverted along the x-axis. When the signs of the source height and the destination height are different then the image is inverted along the y-axis.

    // DrawInvertedBitmap    - Draws the bitmap after inverting it
    // hBimtap        - Bitmap handle
    // hPal            - Palette to use when drawing the bitmap
    // bLateral        - Flag to indicate whether to invert laterally or vertically
    // xDest        - X coordinate of top left corner to draw at
    // yDest        - Y coordinate of top left corner to draw at
    void DrawInvertedBitmap( CDC *pDC, HBITMAP hBitmap, HPALETTE hPal, BOOL bLateral, 
                                int xDest, int yDest )
    {
        // Create a memory DC compatible with the destination DC
        CDC memDC;
        memDC.CreateCompatibleDC( pDC );
     
        // Get logical coordinates
        BITMAP bm;
        ::GetObject( hBitmap, sizeof( bm ), &bm );
     
        //memDC.SelectObject( &bitmap );
        HBITMAP hBmOld = (HBITMAP)::SelectObject( memDC.m_hDC, hBitmap );
        
        
        // Select and realize the palette
        if( hPal && pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
        {
            SelectPalette( pDC->GetSafeHdc(), hPal, FALSE );
            pDC->RealizePalette();
        }
        if( bLateral )
            pDC->StretchBlt( xDest, yDest, bm.bmWidth, bm.bmHeight, &memDC, 
                    bm.bmWidth-1, 0, -bm.bmWidth, bm.bmHeight, SRCCOPY );
        else
            pDC->StretchBlt( xDest, yDest, bm.bmWidth, bm.bmHeight, &memDC, 
                    0, bm.bmHeight-1, bm.bmWidth, -bm.bmHeight, SRCCOPY );
     
        // Restore the old bitmap
        ::SelectObject( memDC.m_hDC, hBmOld );
    }

    Function 2: GetInvertedBitmap

    The GetInvertedBitmap() function creates a new bitmap to store the inverted image. This function too uses the StretchBlt() function for the actual inversion. In this case the destination device context is another memory device context so that the image is rendered into a bitmap.

    // GetInvertedBitmap    - Creates a new bitmap with the inverted image
    // Returns        - Handle to a new bitmap with inverted image
    // hBitmap        - Bitmap to invert
    // bLateral        - Flag to indicate whether to invert laterally or vertically
    HBITMAP GetInvertedBitmap( HBITMAP hBitmap, BOOL bLateral )
    {
        // Create a memory DC compatible with the display
        CDC sourceDC, destDC;
        sourceDC.CreateCompatibleDC( NULL );
        destDC.CreateCompatibleDC( NULL );
     
        // Get logical coordinates
        BITMAP bm;
        ::GetObject( hBitmap, sizeof( bm ), &bm );
     
        // Create a bitmap to hold the result
        HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), 
                            bm.bmWidth, bm.bmHeight);
     
        // Select bitmaps into the DCs
        HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
        HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
        
        if( bLateral )
            destDC.StretchBlt( 0, 0, bm.bmWidth, bm.bmHeight, &sourceDC, 
                    bm.bmWidth-1, 0, -bm.bmWidth, bm.bmHeight, SRCCOPY );
        else
            destDC.StretchBlt( 0, 0, bm.bmWidth, bm.bmHeight, &sourceDC, 
                    0, bm.bmHeight-1, bm.bmWidth, -bm.bmHeight, SRCCOPY );
     
        // Reselect the old bitmaps
        ::SelectObject( sourceDC.m_hDC, hbmOldSource );
        ::SelectObject( destDC.m_hDC, hbmOldDest );
     
        return hbmResult;
    }

  • 相关阅读:
    Windows10 下Apache服务器搭建
    Visual Studio 2019及其注册码
    清理300多台MySQL数据库的过期binlog日志
    JS获取和设置光标的位置
    在android客户端加载html源代码总结
    OpenGL ES2学习笔记(9)-- 转换矩阵
    可行性研究报告 之机房收费系统的可行性研究报告
    eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .
    常见的证书格式和相互转换
    九度OJ 题目1384:二维数组中的查找
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3071062.html
Copyright © 2011-2022 走看看