Как сделать скриншот div с JavaScript?



Я строю что-то под названием "HTML Quiz". Он полностью работает на JavaScript, и это довольно круто.



в конце появляется окно результатов, в котором говорится: "ваши результаты:" и он показывает, сколько времени они взяли, какой процент они получили, и сколько вопросов они получили прямо из 10. Я хотел бы иметь кнопку с надписью "захват результатов" и каким-то образом сделать снимок экрана или что-то из div, а затем просто показать изображение, снятое на странице, где они могут правильно нажать и "сохранить изображение как."



Я действительно хотел бы сделать это так, они могут поделиться своими результатами с другими. Я не хочу, чтобы они "копировали" результаты, потому что они могут легко изменить это. Если они изменят то, что он говорит на изображении, Ну хорошо.



кто-нибудь знает способ сделать это или нечто подобное?

880   11  

11 ответов:

Нет, я не знаю, как "скриншот" элемент, но то, что вы могли бы сделать, это нарисовать результаты викторины в элемент canvas, а затем использовать HTMLCanvasElement объекта и data: URI с содержимым изображения.

когда викторина будет завершена, сделайте следующее:

var c = document.getElementById('the_canvas_element_id');
var t = c.getContext('2d');
/* then use the canvas 2D drawing functions to add text, etc. for the result */

когда пользователь нажимает кнопку "Захват", этого:

window.open('', document.getElementById('the_canvas_element_id').toDataURL());

это откроет новую вкладку или окно с "скриншотом", что позволит пользователю сохранить его. Нет никакого способа, чтобы вызвать диалог "сохранить как", так что это лучшее, что вы можете сделать, на мой взгляд.

Это расширение @Дафан это ответ, используя html2canvas и Сохранитель файлов.js.

$(function() { 
    $("#btnSave").click(function() { 
        html2canvas($("#widget"), {
            onrendered: function(canvas) {
                theCanvas = canvas;


                canvas.toBlob(function(blob) {
                    saveAs(blob, "Dashboard.png"); 
                });
            }
        });
    });
});

этот кодовый блок ждет кнопку с идентификатором btnSave для нажатия. Когда это так, он преобразует widget div к элементу canvas, а затем использует интерфейс Saveas () FileSaver (через FileSaver.js в браузерах, которые не поддерживают его изначально), чтобы сохранить div в виде изображения с именем "Dashboard.формат PNG."

пример этого работа доступна по этому адресу скрипка.

Если вы хотите иметь диалог "Сохранить как", просто передайте изображение в php-скрипт, который добавляет соответствующие заголовки

пример сценария" все-в-одном"script.php

<?php if(isset($_GET['image'])):
    $image = $_GET['image'];

    if(preg_match('#^data:image/(.*);base64,(.*)$#s', $image, $match)){
        $base64 = $match[2];
        $imageBody = base64_decode($base64);
        $imageFormat = $match[1];

        header('Content-type: application/octet-stream');
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false); // required for certain browsers
        header("Content-Disposition: attachment; filename=\"file.".$imageFormat."\";" ); //png is default for toDataURL
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".strlen($imageBody));
        echo $imageBody;
    }
    exit();
endif;?>

<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js?ver=1.7.2'></script>
<canvas id="canvas" width="300" height="150"></canvas>
<button id="btn">Save</button>
<script>
    $(document).ready(function(){
        var canvas = document.getElementById('canvas');
        var oCtx = canvas.getContext("2d");
        oCtx.beginPath();
        oCtx.moveTo(0,0);
        oCtx.lineTo(300,150);
        oCtx.stroke();

        $('#btn').on('click', function(){
            // opens dialog but location doesnt change due to SaveAs Dialog
            document.location.href = '/script.php?image=' + canvas.toDataURL();
        });
    });
</script>

после нескольких часов исследований, я, наконец, нашел решение, чтобы сделать снимок экрана элемента, даже если origin-clean флаг установлен (чтобы предотвратить XSS), вот почему вы можете даже захватить, например, Google Maps (в моем случае). Я написал универсальную функцию, чтобы получить скриншот. Единственное, что вам нужно дополнительно-это библиотека html2canvas (https://html2canvas.hertzen.com/).

пример:

getScreenshotOfElement($("div#toBeCaptured").get(0), 0, 0, 100, 100, function(data) {
    // in the data variable there is the base64 image
    // exmaple for displaying the image in an <img>
    $("img#captured").attr("src", "data:image/png;base64,"+data);
}

имейте в виду console.log() и alert() не создайте вывод, если размер изображения велик.

функция:

function getScreenshotOfElement(element, posX, posY, width, height, callback) {
    html2canvas(element, {
        onrendered: function (canvas) {
            var context = canvas.getContext('2d');
            var imageData = context.getImageData(posX, posY, width, height).data;
            var outputCanvas = document.createElement('canvas');
            var outputContext = outputCanvas.getContext('2d');
            outputCanvas.width = width;
            outputCanvas.height = height;

            var idata = outputContext.createImageData(width, height);
            idata.data.set(imageData);
            outputContext.putImageData(idata, 0, 0);
            callback(outputCanvas.toDataURL().replace("data:image/png;base64,", ""));
        },
        width: width,
        height: height,
        useCORS: true,
        taintTest: false,
        allowTaint: false
    });
}

вы не можете сделать снимок экрана: это было бы безответственным риском для безопасности, чтобы позволить вам сделать это. Однако, вы можете:

  • делать вещи на стороне сервера и генерировать изображение
  • нарисуйте что-то похожее на холст и визуализируйте это на изображение (в браузере, который его поддерживает)
  • используйте некоторые другие библиотеки рисования, чтобы рисовать непосредственно на изображение (медленно, но будет работать на любом браузере)
var shot1=imagify($('#widget')[0], (base64) => {
  $('img.screenshot').attr('src', base64);
});

посмотри htmlshot пакет, затем, проверьте глубоко на стороне клиента:

npm install htmlshot
<script src="/assets/backend/js/html2canvas.min.js"></script>


<script>
    $("#download").on('click', function(){
        html2canvas($("#printform"), {
            onrendered: function (canvas) {
                var url = canvas.toDataURL();

                var triggerDownload = $("<a>").attr("href", url).attr("download", getNowFormatDate()+"电子签名详细信息.jpeg").appendTo("body");
                triggerDownload[0].click();
                triggerDownload.remove();
            }
        });
    })
</script>

цитата

Другой альтернативой является использование GrabzIt по JavaScript API все, что вам нужно сделать, это передать селектор CSS div, который вы хотите захватить. Затем он создаст скриншот только этого div.

<script type="text/javascript" src="grabzit.min.js"></script>
<script type="text/javascript">
GrabzIt("YOUR APPLICATION KEY").ConvertURL("http://www.example.com/quiz.html",
{"target": "#results", "bheight": -1, "height": -1, "width": -1}).Create();
</script>

здесь больше примеров решения как захват HTML-элементов. Для полного раскрытия я создатель API.

насколько я знаю, вы не можете этого сделать, я могу ошибаться. Однако я бы сделал это с php, сгенерировал JPEG с использованием стандартных функций php, а затем отобразил изображение, не должно быть очень сложной задачей, однако зависит от того, насколько кричащее содержимое DIV

Это просто вы можете использовать этот код для захвата скриншот определенной области вы должны определить идентификатор div в html2canvas. Я использую здесь 2 div -:

div id= "автомобиль"
div id = "chartContainer"
если вы хотите захватить только автомобили, то используйте автомобиль я захватил здесь машину только вы можете изменить chartContainer для захвата графике html2canvas ($('#car') скопируйте и вставьте это код

<html>
    <head>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<script>
    window.onload = function () {
    
    var chart = new CanvasJS.Chart("chartContainer", {
        animationEnabled: true,
        theme: "light2",
        title:{
            text: "Simple Line Chart"
        },
        axisY:{
            includeZero: false
        },
        data: [{        
            type: "line",       
            dataPoints: [
                { y: 450 },
                { y: 414},
                { y: 520, indexLabel: "highest",markerColor: "red", markerType: "triangle" },
                { y: 460 },
                { y: 450 },
                { y: 500 },
                { y: 480 },
                { y: 480 },
                { y: 410 , indexLabel: "lowest",markerColor: "DarkSlateGrey", markerType: "cross" },
                { y: 500 },
                { y: 480 },
                { y: 510 }

            ]
        }]
    });
    chart.render();
    
    }
</script>
</head>

<body bgcolor="black">
<div id="wholebody">  
<a href="javascript:genScreenshotgraph()"><button style="background:aqua; cursor:pointer">Get Screenshot of Cars onl </button> </a>

<div id="car" align="center">
    <i class="fa fa-car" style="font-size:70px;color:red;"></i>
    <i class="fa fa-car" style="font-size:60px;color:red;"></i>
    <i class="fa fa-car" style="font-size:50px;color:red;"></i>
    <i class="fa fa-car" style="font-size:20px;color:red;"></i>
    <i class="fa fa-car" style="font-size:50px;color:red;"></i>
    <i class="fa fa-car" style="font-size:60px;color:red;"></i>
    <i class="fa fa-car" style="font-size:70px;color:red;"></i>
</div>
<br>
<div id="chartContainer" style="height: 370px; width: 100%;"></div>
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>

<div id="box1">
</div>
</div>>
</body>

<script>

function genScreenshotgraph() 
{
    html2canvas($('#car'), {
        
      onrendered: function(canvas) {

        var imgData = canvas.toDataURL("image/jpeg");
        var pdf = new jsPDF();
        pdf.addImage(imgData, 'JPEG', 0, 0, -180, -180);
        pdf.save("download.pdf");
        
      
      
      }
     });

}

</script>

</html>

насколько я знаю, это невозможно с javascript.

Что вы можете сделать для каждого результата создайте скриншот, сохраните его где-нибудь и укажите пользователю при нажатии на сохранить результат. (Я думаю, что нет результата только 10, так что не большое дело, чтобы создать 10 jpeg изображение результатов)

Comments

    Ничего не найдено.