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
     
     
     
  • 相关阅读:
    Vsftpd 3.0.2 正式版发布
    Putdb WebBuilder 6.5 正式版本发布
    SoaBox 1.1.6 GA 发布,SOA 模拟环境
    pynag 0.4.6 发布,Nagios配置和插件管理
    Percona Playback 0.4,MySQL 负荷回放工具
    xombrero 1.3.1 发布,微型 Web 浏览器
    Hypertable 0.9.6.4 发布,分布式数据库
    libmemcached 1.0.11 发布
    CryptoHeaven 3.7 发布,安全邮件解决方案
    Android Activity生命周期
  • 原文地址:https://www.cnblogs.com/08shiyan/p/6843097.html
Copyright © 2011-2022 走看看