2015-02-20 3 views
4

Перед тем, как сказать мне это дубликат вопрос, знаю, что я искал через каждый одиночный подобный вопрос и ни ответов ни в одном из них работают для меня.Масштаб изображения перед тем toDataURL - html2canvas

Im используя html2canvas, чтобы захватить снимок DIV, и то, что мне нужно сделать, это масштабировать его до 750x1050 перед сохранением его в формате PNG с помощью canvas.toDataURL().

Ближайший я получил со следующим кодом.

html2canvas(document.getElementById('div_id'), { 
    onrendered: function(canvas) { 

     var extra_canvas = document.createElement("canvas"); 

     extra_canvas.setAttribute('width', 750); 
     extra_canvas.setAttribute('height', 1050); 

     var ctx = extra_canvas.getContext('2d'); 
     ctx.drawImage(canvas, 0, 0, 750, 1050); 
     var dataURL = extra_canvas.toDataURL(); 

     window.open(dataURL); 
    } 
}); 

Изображение было размера правильно, но текст в изображении был крайне низкого качества, как если бы он изменен его после становится PNG.

Является ли это тем, что я делаю что-то неправильно или вы можете просто не масштабироваться таким образом?

Любое предложение/обход будет оценен по достоинству!

+0

PS: div, который я снимаю, представляет собой редактируемый контент div с цветом фона и текстом html внутри. – shaneparsons

ответ

3

Для всех еще интересно, как получить высококачественный контент с высоким разрешением из html: PhantomJS и wkhtmltopdf/wkhtmltoimage являются отличные альтернативы, которые лучше справляются с этим.

+0

Мне кажется, что эти альтернативы не работают для динамического веб-контента, где DOM изменился после загрузки страницы, верно? Кажется, что PhantomJS работает, указав ему URL-адрес, и Wkhtmltopdf, похоже, работает, предоставляя ему HTML-файл или URL-адрес, в отличие от создания изображения на основе текущего состояния веб-приложения. Поправьте меня если я ошибаюсь. –

+0

Я смог использовать wkhtmltopdf со страницей, динамически созданной из php, html и javascript. Страница была специально построена для pdf, так что это произошло в фоновом режиме и не было показано пользователю. Может быть, вы могли бы попробовать что-то в этом направлении? – shaneparsons

+0

По существу повторно создайте то, что вы хотите напечатать в pdf на странице в фоновом режиме. – shaneparsons

2

У меня была немного похожая проблема, и это то, что я в конечном итоге делает

html2canvas($('#div_id'), {width: 750, height: 1050}).then(
    function(canvas) { 
     window.open(canvas.toDataURL("image/png")); 
    } 
) 

Теперь это все еще приводит к нечеткости изображения (особенно с текстом), но это потому, что мой масштаб по умолчанию в браузере был установлен на 110 % тех, которые заставляют window.devicePixelRatio быть 1.1000 ... Я отсортировал это, просто показывая предупреждение для пользователя (работая для этой цели, в котором оно мне нужно), но, видимо, есть лучший способ его решить. https://stackoverflow.com/a/22819006/460586

0

Даже мои изображения шли пикселизированными, а иногда и тесными, когда было много контента, чтобы соответствовать заданной ширине и высоте. После нескольких часов поиска найдено хорошее решение из этого post. Он заботится о поддержании разрешения в значительной степени даже при масштабировании и отсутствии видимой пикселизации.

html2canvas(document.getElementById('div_id'), { 
onrendered: function(canvas) { 
     var ctx = canvas.getContext('2d'); 
     ctx.webkitImageSmoothingEnabled = false; 
     ctx.mozImageSmoothingEnabled = false; 
     ctx.imageSmoothingEnabled = false; 
     var myImage = canvas.toDataURL("image/jpeg,1.0"); 
     } 
}); 
Смежные вопросы