Можно ли захватить или распечатать то, что отображается в HTML-холсте в виде изображения или PDF?
Я хотел бы сгенерировать изображение через холст и быть в состоянии сгенерировать png из этого изображения.
Можно ли захватить или распечатать то, что отображается в HTML-холсте в виде изображения или PDF?
Я хотел бы сгенерировать изображение через холст и быть в состоянии сгенерировать png из этого изображения.
Ответы:
К сожалению. Оригинальный ответ был конкретным для аналогичного вопроса. Это было пересмотрено:
var canvas = document.getElementById("mycanvas");
var img = canvas.toDataURL("image/png");
со значением в IMG вы можете записать его в виде нового изображения следующим образом:
document.write('<img src="'+img+'"/>');
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
. document.write
Код делает URL данных, их делает HTML строку, затем положить копию этой строки в DOM, браузер , то есть разобрать , что HTML - строку, поставить еще одну копию на элемент изображения, а затем разобрать его снова , чтобы включить URL данных в данные изображения, то, наконец, он может показать изображение. Для изображения с размером экрана это огромный объем памяти / копирование / анализ. Просто предложение
HTML5 предоставляет Canvas.toDataURL (mimetype), который реализован в бета-версиях Opera, Firefox и Safari 4. Однако существует ряд ограничений безопасности (в основном для рисования контента из другого источника на холсте).
Так что вам не нужна дополнительная библиотека.
например
<canvas id=canvas width=200 height=200></canvas>
<script>
window.onload = function() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.fillStyle = "green";
context.fillRect(50, 50, 100, 100);
// no argument defaults to image/png; image/jpeg, etc also work on some
// implementations -- image/png is the only one that must be supported per spec.
window.location = canvas.toDataURL("image/png");
}
</script>
Теоретически это должно создать и затем перейти к изображению с зеленым квадратом в середине, но я не проверял.
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Я подумал, что немного расширю сферу этого вопроса с некоторыми полезными тонкостями по этому вопросу.
Чтобы получить холст как изображение, вам необходимо сделать следующее:
var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png");
Вы можете использовать это для записи изображения на страницу:
document.write('<img src="'+image+'"/>');
Где "image / png" - это тип MIME (png - единственный, который должен поддерживаться). Если вам нужен массив поддерживаемых типов, вы можете сделать что-то вроде этого:
var imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/tiff']; //Extend as necessary
var acceptedMimes = new Array();
for(i = 0; i < imageMimes.length; i++) {
if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0) {
acceptedMimes[acceptedMimes.length] = imageMimes[i];
}
}
Вам нужно запускать это только один раз для каждой страницы - это никогда не должно меняться в течение жизненного цикла страницы.
Если вы хотите, чтобы пользователь загружал файл в сохраненном виде, вы можете сделать следующее:
var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); //Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;
Если вы используете это с разными типами MIME, обязательно измените оба экземпляра image / png, но не image / octet-stream. Также стоит упомянуть, что если вы используете какие-либо междоменные ресурсы для рендеринга вашего холста, вы столкнетесь с ошибкой безопасности при попытке использовать метод toDataUrl.
function exportCanvasAsPNG(id, fileName) {
var canvasElement = document.getElementById(id);
var MIME_TYPE = "image/png";
var imgURL = canvasElement.toDataURL(MIME_TYPE);
var dlLink = document.createElement('a');
dlLink.download = fileName;
dlLink.href = imgURL;
dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
document.body.appendChild(dlLink);
dlLink.click();
document.body.removeChild(dlLink);
}
Я бы использовал " wkhtmltopdf ". Это просто отлично работает. Он использует движок webkit (используется в Chrome, Safari и т. Д.), И его очень легко использовать:
wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
Это оно!
Вот некоторая помощь, если вы выполняете загрузку через сервер (таким образом вы можете назвать / конвертировать / постобработать / и т. Д. Свой файл):
-Пост данных с помощью toDataURL
-Установите заголовки
$filename = "test.jpg"; //or png
header('Content-Description: File Transfer');
if($msie = !strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false)
header("Content-type: application/force-download");else
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Expires: 0"); header("Cache-Control: must-revalidate");
header("Pragma: public");
создать изображение
$data = $_POST['data'];
$img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));
-экспорт изображения в формате JPEG
$width = imagesx($img);
$height = imagesy($img);
$output = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($output, 255, 255, 255);
imagefilledrectangle($output, 0, 0, $width, $height, $white);
imagecopy($output, $img, 0, 0, 0, 0, $width, $height);
imagejpeg($output);
exit();
imagesavealpha($img, true);
imagepng($img);
die($img);
Еще одно интересное решение - PhantomJS . Это безголовый сценарий WebKit с JavaScript или CoffeeScript.
Одним из вариантов использования является захват экрана: вы можете программно захватывать веб-содержимое, включая SVG и Canvas, и / или создавать снимки экрана веб-сайта с предварительным просмотром миниатюр.
Лучшей точкой входа является вики-страница захвата экрана .
Вот хороший пример для полярных часов (от RaphaelJS):
>phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png
Вы хотите сделать страницу в PDF?
> phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
Если вы используете jQuery, что делают многие, то вы бы реализовали принятый ответ следующим образом:
var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
.toDataURL
это родной JS.
$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
ровно одна строка.
Вы можете использовать jspdf для захвата холста в изображение или PDF, например:
var imgData = canvas.toDataURL('image/png');
var doc = new jsPDF('p', 'mm');
doc.addImage(imgData, 'PNG', 10, 10);
doc.save('sample-file.pdf');
Больше информации: https://github.com/MrRio/jsPDF
Это другой способ, без строк, хотя я не знаю, быстрее это или нет. Вместо toDataURL (как предлагают все вопросы). В моем случае я хочу предотвратить dataUrl / base64, так как мне нужен буфер массива или представление. Таким образом, другой метод в HTMLCanvasElement есть toBlob
. (Функция TypeScript):
export function canvasToArrayBuffer(canvas: HTMLCanvasElement, mime: string): Promise<ArrayBuffer> {
return new Promise((resolve, reject) => canvas.toBlob(async (d) => {
if (d) {
const r = new FileReader();
r.addEventListener('loadend', e => {
const ab = r.result;
if (ab) {
resolve(ab as ArrayBuffer);
}
else {
reject(new Error('Expected FileReader result'));
}
}); r.addEventListener('error', e => {
reject(e)
});
r.readAsArrayBuffer(d);
}
else {
reject(new Error('Expected toBlob() to be defined'));
}
}, mime));
}
Еще одним преимуществом больших двоичных объектов является то, что вы можете создавать ObjectUrls для представления данных в виде файлов, аналогично элементу «files» в HTMLInputFile. Больше информации:
https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob