У меня есть контейнер DIV с изображением, установленным в качестве фонового изображения (указывается URL-адресом). Есть ли способ перерисовать это фоновое изображение на холст (без повторного контактирования или повторной загрузки с сервера - как изображение контента отображается на экране)?Render background-image to canvas
ответ
Да. Вы можете получить URL фонового изображения, запросить файл изображения как Blob
, создать <img>
элемент, установите src
в Blob URL
ответ на load
случае созданного img
элемента вызова .drawImage()
с img
в качестве первого параметра.
Фоновое изображение может быть кэшировано в зависимости от настроек браузера. Если изображение не кэшировано в браузере, вы можете сначала запросить изображение, а затем установить как css
background-image
, так и <canvas>
, используя один запрос.
Вы можете использовать fetch()
или XMLHttpResponse()
просить background-image
url()
, FileReader()
, FileReader.prototype.readAsDataURL()
установить src
из <img>
к .result
из FileReader
на load
события.
Вы также можете использовать URL.createObjectURL()
, чтобы создать Blob URL
от response
Blob
. URL.revokeObjectURL()
аннулировать Blob URL
.
Проверить вкладку Network
в DevTools
или Developer Tools
, изображение должно быть извлечена
(from cache)
#bg {
width:50px;
height:50px;
background-image:url(http://placehold.it/50x50);
}
<div id="bg"></div>
<br>
<canvas id="canvas" width="50px" height="50px"></canvas>
<script>
window.onload = function() {
var bg = document.getElementById("bg");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image;
img.width = canvas.width;
img.height = canvas.height;
img.onload = (e) => ctx.drawImage(e.target,0,0);
var background = getComputedStyle(bg).getPropertyValue("background-image");
var src = background.replace(/^url|["()]/g, "");
var reader = new FileReader;
reader.onload = (e) => img.src = e.target.result;
fetch(src)
.then(response => response.blob())
.then(blob => {
reader.readAsDataURL(blob);
// const url = URL.createObjectURL(blob); img.src = url;
})
}
</script>
- 1. Canvas export to png не экспортирует backgroundImage
- 2. React render/update canvas
- 3. Canvas dasty border render
- 4. Render .pdf to single Canvas с использованием pdf.js и ImageData
- 5. Render SVG from file to Cairo canvas in Julia
- 6. HTML5 Canvas render/caching issue
- 7. Render grid на HTML5 Canvas
- 8. Fit canvas to parent canvas
- 9. Convert Canvas to ImageSource
- 10. Papervision Render to Bitmap
- 11. Render to texture2d XNA
- 12. DirectX Render to Texture
- 13. graphviz render to gdiplus
- 14. OpenGL Render to texture
- 15. Render HTML to image
- 16. jsreport render to writableStream
- 17. Render Three-js Scene in HTML5 Canvas
- 18. Картинка Canvas 2D to Three.js Canvas
- 19. HTML5 Canvas to Facebook
- 20. canvas image to php
- 21. canvas to WebGL
- 22. canvas toDataUrl to facebook
- 23. canvas to pdf error
- 24. Base64 png to Canvas
- 25. Добавить canvas to fullpage.js
- 26. Binding to Canvas
- 27. Canvas to Bitmap
- 28. Render text with WriteableBitmap on Canvas
- 29. Atom Electron: Render Canvas в другом окне
- 30. OpenGL Render To Texture (To screen) blank
Будет ли этот метод связаться с сервером? Или браузеры обрабатывают его внутренне? Изображение, которое я пытаюсь получить, генерируется за запрос –
Это зависит от настроек браузера. Как правило, браузер не отправляет другой запрос для кэшированного изображения. Если кеш отключен, вы можете использовать ответ от одного запроса, чтобы установить как фоновое изображение, так и рисовать изображение на 'холст'. _ «Изображение, которое я пытаюсь получить, генерируется для каждого запроса» _ Как запрашивается изображение? Можете ли вы включить 'html',' javascript', что вы пытались решить проблему в вопросе? – guest271314
Я показываю страницу третьей части, которая использует только фоновые изображения для отправки изображений (они никогда не используют IMG-тег). Моя цель - загрузить все изображения (с помощью холста), но я не могу позволить себе переназначить сервер, поскольку он вернет другое изображение (для одного и того же URL изображения, каждое отображаемое изображение имеет уникальный URL-адрес, но реконтактирующий сервер даст новое изображение) –