2015-12-14 35 views
0

我有html頁面內容轉換HTML img元素帆布

<div class="span12"> 
    <img id="myImg" src="myImage.png" style="max-width: 100%; height: auto;" /> 
</div> 

其中myImage.png實際尺寸1600 * 900。圖像的尺寸爲796 * 448(保持縱橫比的拉伸)。

我想給img元素轉換(大小爲796 * 448)使用javascript一個canvas元素

function convertImgToCanvas(){ 
    var myImgElement = document.getElementById("myImg"); 
    var myCanvasElement = document.createElement("canvas"); 
    myCanvasElement.width = myImgElement.width; 
    myCanvasElement.height = myImgElement.height; 
    var context = myCanvasElement.getContext('2d'); 
    context.drawImage(myImgElement,0,0);  
} 

產生的畫布的大小1600 * 900,不796 * 448。我期待畫布的大小爲796 * 448

如果我設置高度和畫布的寬度

myCanvasElement.width = '796px'; 
myCanvasElement.height = '448px'; 

畫布的大小成爲796 * 448,但圖像被裁剪

是否有任何解決方案來創建一個canvasimg元件,具有恰好與img元素相同的寬度和高度,而不裁剪圖像?

回答

2

您沒有正確使用drawImage。在這裏看到:https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage

第三個例子允許你指定的x,y,寬度和兩個源的高度參數和目標:ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

所以你的情況最簡單的解決將是這樣的:

context.drawImage(myImgElement, 0, 0, 1600, 900, 0, 0, 796, 448); 

這裏,它是在行動(去整頁,因爲大小):

function convertImgToCanvas(){ 
 
    var myImgElement = document.getElementById("myImg"); 
 
    var myCanvasElement = document.createElement("canvas"); 
 
    // don't forget to add it to the DOM!! 
 
    document.body.appendChild(myCanvasElement); 
 
    myCanvasElement.width = 796; 
 
    myCanvasElement.height = 448; 
 
    var context = myCanvasElement.getContext('2d'); 
 
    context.drawImage(myImgElement, 0, 0, 1600, 900, 0, 0, 796, 448); 
 
    // remove the image for the snippet 
 
    myImgElement.style.display = 'none'; 
 
} 
 

 
convertImgToCanvas();
<div class="span12"> 
 
    <img id="myImg" src="https://upload.wikimedia.org/wikipedia/commons/0/08/Ice-and-Fire-showdown_1600x900.jpg" style="max-width: 100%; height: auto;" /> 
 
</div>

+0

如果1600和900是圖像寬度/高度,那麼只是'context.drawImage(myImgElement,0,0,796,448);'將具有相同的確切效果。如果796和448是相對維度,那麼'var rect = imageElement.getBoundingClientRect(); context.drawImage(myImgElement,0,0,rect.width,rect.height);'是OP需要的。無論如何,你應該把'convertImgToCanvas()'調用包裝到img的onload事件中 – Kaiido

+0

我不會把它包裝到任何東西中,因爲我不知道OP要做什麼。是的,關於drawImage的確如此,我想展示該方法的所有可能性。 – Shomz

+0

然後我不確定這是「最簡單的修復」,因爲你顯示OP,'drawImage()'甚至具有修剪屬性。我認爲他的案例中「最簡單」就是那個完全按照他的意願去做的人,而且只是這個。 – Kaiido

0

您可以使用scale

function convertImgToCanvas(){ 
    var myImgElement = document.getElementById("myImg"); 
    var myCanvasElement = document.createElement("canvas"); 
    myCanvasElement.width = myImgElement.width; 
    myCanvasElement.height = myImgElement.height; 
    var context = myCanvasElement.getContext('2d'); 
    context.scale(myCanvasElement.width/myImgElement.width, myCanvasElement.height/myImgElement.height); 
    context.drawImage(myImgElement, 0, 0); 
}