首页 > 解决方案 > 在 C# 中将剪贴板 PrintScreen 保存到图像文件

问题描述

我正在尝试使用 Visual Studio C# 打印屏幕,然后将屏幕截图保存到文件中。

目前,我在从剪贴板读取时遇到问题。

我尝试使用以下两行将屏幕截图保存到剪贴板:

SendKeys.SendWait("+{PRTSC}");
SendKeys.SendWait("{PRTSC}");

但是,当我尝试使用以下行保存图像时,我得到一个空引用异常。

如何解决这个问题?

我的代码如下

标记代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h2>Welcome to ASP.NET!
            </h2>
            1. Copy image data into clipboard or press Print Screen
            <br />
            2. Press Ctrl+V (page/iframe must be focused):
            <br />
            <br />
            <canvas style="border: 1px solid grey;" id="cc" width="200" height="200">
                <script type="text/javascript">
                    var canvas = document.getElementById("cc");
                    var ctx = canvas.getContext("2d");

                    //=== Clipboard ===============================

                    window.addEventListener("paste", pasteHandler); //chrome
                    //handler
                    function pasteHandler(e) {
                        if (e.clipboardData == false) return false; //empty
                        var items = e.clipboardData.items;
                        if (items == undefined) return false;
                        for (var i = 0; i < items.length; i++) {
                            if (items[i].type.indexOf("image") == -1) continue; //not image
                            var blob = items[i].getAsFile();
                            var URLObj = window.URL || window.webkitURL;
                            var source = URLObj.createObjectURL(blob);
                            paste_createImage(source);
                        }
                    }
                    //draw pasted object
                    function paste_createImage(source) {
                        var pastedImage = new Image();
                        pastedImage.onload = function () {
                            ctx.drawImage(pastedImage, 0, 0);
                        }
                        pastedImage.src = source;
                    }

                </script>
            </canvas>
            <br />
        </div>
        <div>
            <asp:Button ID="btn" runat="server" OnClick="btn_Click" Text="Go" />
        </div>
    </form>
</body>
</html>

代码隐藏

protected void btn_Click(object sender, EventArgs e)
{
    var path = new[] { @"C:\Users\A\source\repos\CopyPaste\public",
                       @"C:\Users\A\source\repos\CopyPaste\public" }.First(p => Directory.Exists(p));

    var prefix = "css-social-media-icon-list";
    var fileName = Enumerable.Range(1, 100)
                    .Select(n => Path.Combine(path, $"{prefix}-{n}.png"))
                    .First(p => !File.Exists(p));

    Clipboard.GetImage().Save(fileName, ImageFormat.Png);
    Clipboard.SetText($"![image](/public/{Path.GetFileName(fileName)})");
}

标签: c#asp.netimage-processingcanvas

解决方案


我希望这会有所帮助......按照这个例子


推荐阅读