2016-11-11 130 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,但重新連接服務器會生成新圖像) –