Сохранение экрана печати буфера обмена в файл изображения на C#

#c# #asp.net #image-processing #canvas

#c# #asp.net #обработка изображений #холст

Вопрос:

Я пытаюсь использовать 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:UsersAsourcereposCopyPastepublic",
                       @"C:UsersAsourcereposCopyPastepublic" }.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)})");
}
  

Ответ №1:

Я надеюсь, что это поможет… следуя этому примеру