предисловие
Я слышал это раньшеhtml2canvasЭто яма, но беспомощная перед гнетом спроса на продукт, функция html to image должна быть реализована, и с тех пор он встал на путь заполнения ямы.К счастью, конечный эффект вполне удовлетворительный, так что продукт цикл запуска не пропущен.
Введение в html2canvas
html2canvas
Для получения подробной информации, пожалуйста, нажмитездесьВид, по сути, просто проставленныйcanvas
БудуHTML
СгенерированоDOM
Узлы прорисовываются на холсте, а затем их можно преобразовать в картинки в соответствии с собственными потребностями.Поэтому в официальном документе также сказано, что конечный сгенерированный эффект не на 100% одинаков.Каждый должен быть к этому морально готов.Нет несмотря ни на что, небольшой недостаток уверен.
совместимость
PS:Браузер WeChatЭто не проблема использоватьИспользуйте html2canvas
Использование также очень простое, официальный сайт очень понятенкликните сюда
Ступая на яму
Почему в сгенерированных изображениях отсутствуют аватары WeChat или другие изображения?
На самом деле он включаетперекрестный доменПроблема, даже у полотна холста есть требования к полю картинки, так как же нам ее решить?
-
html2canvas
изэлемент конфигурацииСредняя конфигурацияallowTaint:true
илиuseCORS:true
(два нельзя использовать вместе) - добавлен тег img
crossOrigin='anonymous'
- Конфигурация сервера изображений
Access-Control-Allow-Origin
или использовать прокси
Третий шаг самый важный, если его не задать, первые два шага будут недействительны.
Сервер нужно настроитьAccess-Control-Allow-Origin
Информация, такая как PHP, добавляющая информацию заголовка ответа, подстановочный знак * означает, что разрешено любое доменное имя:
header("Access-Control-Allow-Origin: *");
Или укажите доменное имя:
header("Access-Control-Allow-Origin: www.zhangxinxu.com");
Но если мы не хотим беспокоить обслуживающий персонал, как мы можем междоменное взаимодействие во внешнем интерфейсе?
Затем вы можете использовать прокси-плагины, такие как:html2canvas-proxy-nodejsилиsuperagent, Я используюsuperagent
, вставьте пример кода:
const request = require('superagent') // 导入
const proxHost = 'https://thirdwx.qlogo.cn' // 指定跨域图片的地址
app.use('/proxy', function (req, res, next) {
let urlPath = req.url
console.log('urlPath', urlPath)
urlPath = decodeURI(urlPath)
if (!urlPath) {
console.log('urlPath is null')
return next()
}
console.log('proxy-request: /proxy->' + `${proxHost}${urlPath}`)
const reqStream = request.get(`${proxHost}${urlPath}`)
reqStream.on('error', function (err) {
console.log('error', err)
})
console.log('------reqStream----')
return reqStream.pipe(res)
})
затем, наконец, src моего изображения на страницеhttps://thirdwx.qlogo.cn/xxx
изменить на/proxy/xxx
Схема эффекта выглядит следующим образом:
2. Что делать, если сгенерированное изображение размыто и имеет неровные дефекты?
В большинстве найденных результатов для работы используется соотношение пикселей устройства, но на практике все равно будет иметь место наложение.
Эта проблема беспокоила меня долгое время, и я долго искал нужную информацию. Наконец, тяжелая работа окупилась и позволила мне найти решение. В гитхабе есть великий бог, который предоставил решение, вы можете нажатьздесь, Великий Бог добавляют две элементы конфигурации на основе источника,scale
а такжеdpi
,Рекомендуемое использованиеscale
параметр.
Расположение исходного кода:https://github.com/eKoopmans/html2canvas/tree/develop/dist
let imgHeight = window.document.querySelector('.content').offsetHeight // 获取DOM高度
let imgWidth = window.document.querySelector('.content').offsetWidth // 获取DOM宽度
let scale = window.devicePixelRatio // 获取设备像素比
html2canvas(window.document.querySelector('.content'), {
useCORS: true,
scale: scale,
width: imgWidth,
height: imgHeight
}).then((canvas) => {
window.document.querySelector('.content').remove()
let elemImg = `<img src='${canvas.toDataURL('image/png')}' id='canvas-img' style='height: ${imgHeight}px;border-radius: 10px;width:${imgWidth}px'/>`
window.document.querySelector('.container').innerHTML = elemImg
})
Окончательное сгенерированное изображение является четким и ближайшимDOM
картинка
3. Если сгенерированное изображение содержит QR-код, не распознает ли WeChat длительное нажатие на изображение?
Эта проблема в основном возникает со страницами, использующими одностраничную структуру, такую как VUE. благодарныйsundaypigпредложенное решение. Это очень просто, просто не используйте коммутацию маршрутизации, используйтеwindow.location.href
Перейти прямо, чтобы обновить страницу
location.href="www.abc.com/share/xxx"
PS: Эта проблема может решить ситуацию, когда QR-код иногда не распознается на всех страницах.
4. Большой ли интервал между текстом в сгенерированном изображении?
На данный момент это не может быть решено идеально, вы можете попробовать использовать свойства css:letter-spacing
Чтобы установить интервал слова