如果我將參考圖像傳遞給drawImage
API的HTML canvas
,但圖像仍在加載,那麼會發生什麼?會得到一個異常,或者API將繼續處理部分數據,或者API將被阻塞直到圖像被加載?如果我嘗試將drawImage()用於尚未完全加載的圖像,會發生什麼情況?
回答
canvas spec指示即使99%加載,也不會繪製任何東西。它不會拋出錯誤。
所以,如果你這樣做:
var img = new Image();
img.src = 'http://placekitten.com/300/300';
// Might occur before the image is done loading (bad!)
ctx.drawImage(img, 0, 0);
這就是爲什麼大多數人做類似的東西:
var img = new Image();
img.onload = function() {
// Will occur only once the image is done loading
ctx.drawImage(img, 0, 0);
}
img.src = 'http://placekitten.com/300/300';
爲了確保圖像會拿得出。
我曾經偶然發現過這個;問題是我沒有看到任何東西,因爲我沒有使用img.onload
。
您可以確認:http://jsfiddle.net/pimvdb/eGjak/100/。它最初可能不會顯示,但會因緩存而重新加載。
最佳做法是始終使用onload
。
該API不會在畫布上繪製任何內容。除非你使用一個循環來重畫帶有包含在其上的圖像的畫布,否則用戶將永遠看不到圖像。通常的做法是使用canvas的圖像加載 - 所有支持canvas支持img.onload的瀏覽器。在一個循環的情況下,你可能會逃避添加圖像的動態,但知道,直到他們下載他們沒有看到。
The spec說沒有東西要畫。
如果第一個參數不是img,canvas或video元素,則會引發TYPE_MISMATCH_ERR異常。如果圖像沒有圖像數據,則會引發INVALID_STATE_ERR異常。如果其中一個源矩形維度爲零,則會引發INDEX_SIZE_ERR異常。 如果圖像尚未完全解碼,則不會繪製任何圖像。
我試過它只是爲了它的地獄。你可以see the results here.
我基本上使用PHP來減慢圖像加載速度。
slowimage.php
<?php
sleep(3);
header('Content-type: image/png');
echo file_get_contents('stackoverflow-logo-300.png');
?>
的index.html
<canvas id="canvas" width="512" height="512">
<script>
var img = new Image();
img.onload = function() {
alert("image loaded");
};
img.src = "slowimage.php";
var ctx = document.getElementById("canvas").getContext("2d");
ctx.drawImage(img, 0, 0);
</script>
由於已經建立,並且你可以看到,什麼也不繪製。
+1對於演示並在帖子中引用規範。謝謝。 – AppleGrew
這個答案花了我20分鐘:) –
- 1. 如果我的IExceptionPublisher引發異常,會發生什麼情況?
- 2. 如果您嘗試釋放已釋放的對象,會發生什麼情況?
- 3. 如果我在未使用的pthread_t上調用pthread_join()會發生什麼情況?
- 4. 如果我不調用transaction.close或transaction.rollback,會發生什麼情況?
- 5. 如果我使用printf(「one \ 0two」),會發生什麼情況;?
- 6. 如果未處理事件會發生什麼情況?
- 7. 如果未捕獲到異常,會發生什麼情況?
- 8. 如果MySQL數據庫未關閉,會發生什麼情況?
- 9. 如果StreamReader或StreamWriter未關閉,會發生什麼情況?
- 10. 如果決策器未運行,會發生什麼情況
- 11. 如果未安裝代碼合同,會發生什麼情況?
- 12. 如果Firebase網址不存在,我們會嘗試添加偵聽器,會發生什麼情況?
- 13. 如果我引用由dlclose卸載的指令,會發生什麼情況?
- 14. 如果有人拿到我的appsecret,會發生什麼情況?
- 15. 如果在Firefox中的圖像上應用邊框,會發生什麼情況
- 16. 如果minSdkVersion低於targetSdkVersion,會發生什麼情況?
- 17. 如果我嘗試在沒有Timeline的用戶上發佈Facebook操作,會發生什麼情況?
- 18. 如果我嘗試使用比我更多的內核,會發生什麼情況?
- 19. 如果數百萬用戶試圖登錄到asp.net,會發生什麼情況
- 20. 如果我不指定targetFramework =「4.0」,會發生什麼情況?
- 21. TFS - 如果我刪除工作區會發生什麼情況?
- 22. 如果您將值分配給$ _REQUEST,會發生什麼情況?
- 23. 如果我將整數發送到BigQuery字段「string」,會發生什麼情況?
- 24. SKPaymentQueue:如果我從未打電話給finishTransaction會發生什麼情況:?
- 25. 如果我從未撥打回叫,JavaScript會發生什麼情況?
- 26. 如果您未將其分配給變量,會發生什麼情況?
- 27. 如果我分離已加入的線程會發生什麼情況?
- 28. 如果iOS圖像尺寸計算不正確會發生什麼情況?
- 29. 如果在Application_Start中引發未處理的異常,會發生什麼情況?
- 30. minimax:如果min不起作用會發生什麼情況
+1規範鏈接。 – pimvdb
感謝您的解釋和解決方案。 – AppleGrew