zoukankan      html  css  js  c++  java
  • BitBlt 函数 详解, StretchBlt、SetStretchBltMode、SetBrushOrgEx 按句柄截图、直接截取缩略图

    BitBlt 

    该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境

     函数原型

                [DllImport("gdi32.dll")]
                public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, 
    IntPtr hObjectSource,
    int nXSrc, int nYSrc, int dwRop);

    参数

    hDestDC:指向目标设备环境的句柄
    x:指定目标矩形区域左上角的X轴逻辑坐标。
    y:指定目标矩形区域左上角的Y轴逻辑坐标。
    nWidth:指定源在目标矩形区域的逻辑宽度。
    nHeight:指定源在目标矩形区域的逻辑高度。
    hSrcDC:指向源设备环境的句柄。
    xSrc:指定源矩形区域左上角的X轴逻辑坐标。
    ySrc:指定源矩形区域左上角的Y轴逻辑坐标。
    dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
     
    下面列出了一些常见的光栅操作代码:
     
    BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
    DSTINVERT:表示使目标矩形区域颜色取反。
    MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
    MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
    NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
    NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
    PATCOPY:将特定的模式拷贝到目标位图上。
    PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
    PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
    SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
    SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
    SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
    SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
    SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
    WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
    dwRop Values
    From wingdi.h:
    #define BLACKNESS 0x42
    #define DSTINVERT 0x550009
    #define MERGECOPY 0xC000CA
    #define MERGEPAINT 0xBB0226
    #define NOTSRCCOPY 0x330008
    #define NOTSRCERASE 0x1100A6
    #define PATCOPY 0xF00021
    #define PATINVERT 0x5A0049
    #define PATPAINT 0xFB0A09
    #define SRCAND 0x8800C6
    #define SRCCOPY 0xCC0020
    #define SRCERASE 0x440328
    #define SRCINVERT 0x660046
    #define SRCPAINT 0xEE0086
    #define WHITENESS 0xFF0062
     

    返回值

    如果函数成功,那么返回值非零;如果函数失败,则返回值为零。
    Windows NT:若想获取更多错误信息,请调用GetLastError函数。
    备注:如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、压缩或旋转。
    如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,那么BitBlt函数返回错误。
    Windows CE:在Windows CE 1.0版中,参数dwRop只可以指定为下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0版中,参数dwRop可以是任何光栅操作代码值。
    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。
     
     
     

    按句柄截图 、直接截取缩略图

     
        public static class ImageHelper
        {
    
            public static Bitmap CaptureWindow(IntPtr handle, int width, int height)
            {
                try
                {
                    // get the hDC of the target window
                    IntPtr hdcSrc = User32.GetWindowDC(handle);
                    // create a device context we can copy to
                    IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
                    // create a bitmap we can copy it to,
                    // using GetDeviceCaps to get the width/height
                    IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
                    // select the bitmap object
                    IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
                    // bitblt over
                    GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
                    // restore selection
                    GDI32.SelectObject(hdcDest, hOld);
                    // clean up 
                    GDI32.DeleteDC(hdcDest);
                    User32.ReleaseDC(handle, hdcSrc);
    
                    // get a .NET image object for it
                    Bitmap img = Image.FromHbitmap(hBitmap);
                    // free up the Bitmap object
                    GDI32.DeleteObject(hBitmap);
    
                    return img;
                }
                catch (Exception ex)
                {
                    LogHelper.Execption(ex, nameof(ImageHelper));
                }
                return null;
            }
    
    
            public static Bitmap CaptureWindow(IntPtr handle, int widthSrc, int heightSrc, int widthDest, int heightDest)
            {
                try
                {
                    // get the hDC of the target window
                    IntPtr hdcSrc = User32.GetWindowDC(handle);
                    // create a device context we can copy to
                    IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
                    // create a bitmap we can copy it to,
                    // using GetDeviceCaps to get the width/height
                    IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, widthDest, heightDest);
                    // select the bitmap object
                    IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
    
                    GDI32.SetStretchBltMode(hdcDest, GDI32.STRETCH_HALFTONE);
    
                    GDI32.POINTAPI point;
                    GDI32.SetBrushOrgEx(hdcDest, 0, 0, out point);
    
                    // bitblt over
                    GDI32.StretchBlt(hdcDest, 0, 0, widthDest, heightDest, hdcSrc, 0, 0, widthSrc, heightSrc, GDI32.SRCCOPY);
                    // restore selection
                    GDI32.SelectObject(hdcDest, hOld);
                    // clean up 
                    GDI32.DeleteDC(hdcDest);
                    User32.ReleaseDC(handle, hdcSrc);
    
                    // get a .NET image object for it
                    Bitmap img = Image.FromHbitmap(hBitmap);
                    // free up the Bitmap object
                    GDI32.DeleteObject(hBitmap);
    
                    return img;
                }
                catch (Exception ex)
                {
                    LogHelper.Execption(ex, nameof(ImageHelper));
                }
                return null;
            }
    
    
    
    
            /// <summary>  
            /// Helper class containing Gdi32 API functions  
            /// </summary>  
            public class GDI32
            {
                public const int CAPTUREBLT = 1073741824;
                public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter  
                [DllImport("gdi32.dll")]
                public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
                    int nWidth, int nHeight, IntPtr hObjectSource,
                    int nXSrc, int nYSrc, int dwRop);
                [DllImport("gdi32.dll")]
                public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
                    int nHeight);
                [DllImport("gdi32.dll")]
                public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
                [DllImport("gdi32.dll")]
                public static extern bool DeleteDC(IntPtr hDC);
                [DllImport("gdi32.dll")]
                public static extern bool DeleteObject(IntPtr hObject);
                [DllImport("gdi32.dll")]
                public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
    
    
    
    
                /// <summary>
                /// 缩放截图
                /// </summary>
                /// <param name="hdcDest"></param>
                /// <param name="nXOriginDest"></param>
                /// <param name="nYOriginDest"></param>
                /// <param name="nWidthDest"></param>
                /// <param name="nHeightDest"></param>
                /// <param name="hdcSrc"></param>
                /// <param name="nXOriginSrc"></param>
                /// <param name="nYOriginSrc"></param>
                /// <param name="nWidthSrc"></param>
                /// <param name="nHeightSrc"></param>
                /// <param name="dwRop"></param>
                /// <returns></returns>
                [DllImport("gdi32.dll")]
                public static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,
                    IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, int dwRop);
    
    
                public const int STRETCH_ANDSCANS = 0x01;
                public const int STRETCH_ORSCANS = 0x02;
                public const int STRETCH_DELETESCANS = 0x03;
                public const int STRETCH_HALFTONE = 0x04;
    
    
                /// <summary>
                /// 设置缩放模式
                /// </summary>
                /// <param name="hdc"></param>
                /// <param name="iStretchMode"></param>
                /// <returns>失败返回0</returns>
                [DllImport("gdi32.dll")]
                public static extern int SetStretchBltMode(IntPtr hdc, int iStretchMode);
    
    
                [StructLayout(LayoutKind.Sequential)]
                public struct POINTAPI
                {
                    public int x;
                    public int y;
                }
    
    
                [DllImport("gdi32.dll")]
                public static extern bool SetBrushOrgEx(IntPtr hdc, int nXOrg, int nYOrg, out POINTAPI lppt);
    
    
    
    
    
            }
    
    
            /// <summary>  
            /// Helper class containing User32 API functions  
            /// </summary>  
            public class User32
            {
                [StructLayout(LayoutKind.Sequential)]
                public struct RECT
                {
                    public int left;
                    public int top;
                    public int right;
                    public int bottom;
                }
    
                [DllImport("user32.dll")]
                public static extern IntPtr GetDesktopWindow();
    
                [DllImport("user32.dll")]
                public static extern IntPtr GetWindowDC(IntPtr hWnd);
    
                [DllImport("user32.dll")]
                public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
    
                [DllImport("user32.dll")]
                public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
    
    
                public const int WM_PAINT = 0x000F;
                [DllImport("user32.dll", EntryPoint = "SendMessageA")]
                public static extern uint SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    
    
                [DllImport("user32.dll")]
                public static extern bool PrintWindow(
                    IntPtr hwnd,                // Window to copy,Handle to the window that will be copied.
                    IntPtr hdcBlt,              // HDC to print into,Handle to the device context.
                    UInt32 nFlags               // Optional flags,Specifies the drawing options. It can be one of the following values.
                    );
    
                [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
                public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
    
                #region  窗口关联
                //            nCmdShow的含义
                //0 关闭窗口
                //1 正常大小显示窗口
                //2 最小化窗口
                //3 最大化窗口
                //使用实例: ShowWindow(myPtr, 0);
                #endregion
            }
    
        }
    按句柄截图、直接截取缩略图 Demo
     
    参考资料: 百度百科  随笔  MSDN 
    延展阅读: MSDN Bitmap Functions
     
     
     
  • 相关阅读:
    gdb调试工具
    一步步理解Linux之中断和异常
    英语感受 5月份英语思维
    2013年6月4日星期二
    2013年5月29日星期三
    2013年6月3日星期一
    第22周六晚上
    2013年5月26日星期日
    2013年5月28日20:16:21
    2013年6月2日星期日
  • 原文地址:https://www.cnblogs.com/08shiyan/p/6843097.html
Copyright © 2011-2022 走看看