zoukankan      html  css  js  c++  java
  • CEF截图

    记录目前两种实现方式

    [DllImport("user32.dll")]
            private static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);
    
            public void WriteBmp(string bmpPath)
            {
    
                int screenWidth = webbrowser.Document.Body.ScrollRectangle.Width;
                int screenHeight = webbrowser.Document.Body.ScrollRectangle.Height;
    
                IntPtr myIntptr = webbrowser.Handle;
                int hwndInt = myIntptr.ToInt32();
                IntPtr hwnd = myIntptr;
    
                // Set hdc to the bitmap
    
                Bitmap bm = new Bitmap(screenWidth, screenHeight);
                Graphics g = Graphics.FromImage(bm);
                IntPtr hdc = g.GetHdc();
    
                // Snapshot the WebBrowser
    
                bool result = PrintWindow(hwnd, hdc, 0);
                g.ReleaseHdc(hdc);
                g.Flush();
    
                // Save the bitmap, if successful
    
                if (result == true)
                    bm.Save(bmpPath);
            }

    第二种

    public static class ApiConstants
        {
            public const int SRCCOPY = 13369376;
        }
    
        public static class Utilities
        {
            public static Image CaptureScreen()
            {
                return CaptureWindow(User32.GetDesktopWindow());
            }
    
            public static Image CaptureWindow(IntPtr handle)
            {
    
                IntPtr hdcSrc = User32.GetWindowDC(handle);
    
                RECT windowRect = new RECT();
                User32.GetWindowRect(handle, ref windowRect);
    
                int width = windowRect.right - windowRect.left;
                int height = windowRect.bottom - windowRect.top;
    
                IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);
                IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);
    
                IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);
                Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, ApiConstants.SRCCOPY);
                Gdi32.SelectObject(hdcDest, hOld);
                Gdi32.DeleteDC(hdcDest);
                User32.ReleaseDC(handle, hdcSrc);
    
                Image image = Image.FromHbitmap(hBitmap);
                Gdi32.DeleteObject(hBitmap);
    
                return image;
            }
        }
    
        public static class User32
        {
            [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 GetWindowRect(IntPtr hWnd, ref RECT rect);
            [DllImport("user32.dll")]
            public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
        }
    
        public class Gdi32
        {
            [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);
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
    }

    引用https://www.cnblogs.com/jackhuclan/archive/2012/04/23/1909301.html

    新增

    第三种,使用前端库截图, 这里截图直接是指定元素的全图,包括滚动条不可见部分,避免了使用windows句柄截图只能截取可视区域。

    dom-to-image

    添加引用

    <script src="dom-to-image/dom-to-image.js"></script>

    添加截图方法

    function shotScreenAsync() {
      return new Promise((resolve, rejece) => {
        var appElement = document.getElementById('app');
        domtoimage.toPng(appElement, {
          bgcolor: "#ffffff",
          style: {
            overflow: ""
          }
        }).then(data => {
          resolve(data);
        }).catch(error => {
            rejece(error)
          });
      })
    }
  • 相关阅读:
    开源.net 混淆器ConfuserEx介绍
    k8s删除namespace失败,状态Terminating解决方案
    java get all threadlocal from thread
    mysql查看索引的大小
    InnoDB一定会在索引中加上主键吗?
    全链路追踪traceId,ThreadLocal与ExecutorService
    redis 批量删除keys
    shell逐行读取excel并执行sql
    Is it possible to create @Around Aspect for feign.Client
    Spring Boot后台启动不打印nohup.out
  • 原文地址:https://www.cnblogs.com/guanglin/p/12168254.html
Copyright © 2011-2022 走看看