2014-04-22 38 views
1
<script> 
    var canvas = document.getElementById('myCanvas'); 
    var context = canvas.getContext('2d'); 
    var img = new Image(); 
    img.onload = function(){ 
    canvas.width=img.width; 
    canvas.height=img.height; 
    context.drawImage(img,0,0); 
    } 
    img.src="2.jpg"; 
    function compress(){ 
    var dataURL = canvas.toDataURL("image/jpg",0.5); 
    document.getElementById("img").src=dataURL; 
    }   
    setTimeout(compress,1000); 
</script> 

我試過以fillRect()爲例,而不是drawImage()。所以它正常工作...我敢肯定,原因是drawImage()爲什麼在canvas(JS)t​​oDataUrl()在drawImage()之後不起作用?

+1

在您正在測試的代碼中,圖片的*真實*網址是什麼?特別是,它是否與代碼所在的頁面來自同一個域? – Pointy

+0

此外,你真的應該把電話「壓縮」在圖像「onload」回調;你依靠圖像HTTP請求在1秒內完成,這可能實際發生,也可能不實際發生。 – Pointy

回答

2

如果您的圖像網址(原始網址,而不是數據網址)來自不同的域,而不是運行代碼的頁面的域,則當您將圖像繪製到它時,畫布將被污染,並且您將無法將像素取出。這是一個安全措施。因此,如果您正在使用jsfiddle進行測試,並且您正在使用http://placekitten.com/100/100網址進行測試,則無法運行。

請注意,大多數現代瀏覽器不會考慮兩個file:// URL共享一個域,所以如果您從本地文件運行測試,它將不起作用。

+0

實際上,圖片和頁面位於同一個域中,URL中沒有「file://」。這就是爲什麼你的解決方案不起作用=( – user3560634

+0

@ user3560634那麼你必須提供更多的信息,或嘗試擺脫'setTimeout()'破解,因爲這也可能導致這個問題 – Pointy

+0

@ user3560634 [這裏是你的代碼在我寫的測試頁中,並且它能正常工作。](http://gutfullofbeer.net/imgtst/)我所做的一切都是爲了擺脫超時並將調用「壓縮」到圖像「load 「處理程序,在圖像被繪製到畫布後。 – Pointy

相關問題