2016-11-11 132 views
0

我有一个图像设置为背景图像(由url指定)的DIV容器。有没有办法如何将这个背景图像重新绘制到画布中(无需重新联系或从服务器重新下载 - 因为内容图像一次显示)?将背景图像渲染到画布

回答

1

是的。您可以获取背景图像的URL,请求图像文件为Blob,创建<img>元素,设置srcBlob URL的响应,在load创建的事件img元素调用.drawImage()img作为第一个参数。

根据浏览器设置,可以缓存背景图像。如果图像未在浏览器中缓存,则可以先请求图像,然后使用单个请求设置cssbackground-image<canvas>

您可以使用fetch()XMLHttpResponse()要求background-imageurl(),​​,FileReader.prototype.readAsDataURL()load事件来设置的<img>srcFileReader.result

您也可以使用URL.createObjectURL()创建一个Blob URLresponseBlobURL.revokeObjectURL()撤销Blob URL

检查Network选项卡DevToolsDeveloper 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>

+0

请问这个方法接触服务器?或者浏览器在内部处理它?我试图得到的图像是根据请求生成的 –

+0

这取决于浏览器设置。通常,浏览器不会发送另一个缓存图像请求。如果禁用了缓存,则可以使用来自单个请求的响应将背景图像和图像设置为“canvas”。 _“我想要得到的图像是根据请求生成的”_图像是如何请求的?你可以包括'html','''你试图解决问题的问题? – guest271314

+0

我正在显示仅使用背景图像显示图像的第三方页面(它们从不使用IMG标签)。我的目标是下载所有图像(在画布的帮助下),但我无法承担重新连接服务器,因为它会返回另一个图像(对于相同的图像URL;每个显示的图像都有唯一的url,但重新连接服务器会生成新图像) –