web-dev-qa-db-fra.com

Dessin du canevas

J'essaie de mettre une image à l'échelle proportionnellement à la toile. Je suis capable de le mettre à l'échelle avec une largeur et une hauteur fixes comme suit:

context.drawImage(imageObj, 0, 0, 100, 100)

Mais je veux seulement redimensionner la largeur et faire redimensionner la hauteur proportionnellement. Quelque chose comme ceci:

context.drawImage(imageObj, 0, 0, 100, auto)

J'ai regardé partout où je peux penser et je n'ai pas vu si c'était possible.

52
selanac82
context.drawImage(imageObj, 0, 0, 100, 100 * imageObj.height / imageObj.width)
88
Gaurav

la solution de @TechMaze est assez bonne.

voici le code après une certaine correction et introduction de l'événement image.onload. image.onload est trop essentiel pour s'abstenir de tout type de distorsion.

function draw_canvas_image() {

var canvas = document.getElementById("image-holder-canvas");
var context = canvas.getContext("2d");
var imageObj = document.getElementById("myImageToDisplayOnCanvas");

imageObj.onload = function() {
  var imgWidth = imageObj.naturalWidth;
  var screenWidth  = canvas.width;
  var scaleX = 1;
  if (imgWidth > screenWidth)
      scaleX = screenWidth/imgWidth;
  var imgHeight = imageObj.naturalHeight;
  var screenHeight = canvas.height;
  var scaleY = 1;
  if (imgHeight > screenHeight)
      scaleY = screenHeight/imgHeight;
  var scale = scaleY;
  if(scaleX < scaleY)
      scale = scaleX;
  if(scale < 1){
      imgHeight = imgHeight*scale;
      imgWidth = imgWidth*scale;          
  }

  canvas.height = imgHeight;
  canvas.width = imgWidth;

  context.drawImage(imageObj, 0, 0, imageObj.naturalWidth, imageObj.naturalHeight, 0,0, imgWidth, imgHeight);
}
}
5
Mashhood

Et si vous souhaitez mettre à l'échelle correctement l'image selon la taille de l'écran, voici les calculs que vous pouvez faire: SI VOUS N'UTILISEZ PAS JQUERY, REMPLACEZ $ (fenêtre) .width avec l'option équivalente appropriée.

var imgWidth = imageObj.naturalWidth;
var screenWidth  = $(window).width() - 20; 
var scaleX = 1;
if (imageWdith > screenWdith)
    scaleX = screenWidth/imgWidth;
var imgHeight = imageObj.naturalHeight;
var screenHeight = $(window).height() - canvas.offsetTop-10;
var scaleY = 1;
if (imgHeight > screenHeight)
    scaleY = screenHeight/imgHeight;
var scale = scaleY;
if(scaleX < scaleY)
    scale = scaleX;
if(scale < 1){
    imgHeight = imgHeight*scale;
    imgWidth = imgWidth*scale;          
}
canvas.height = imgHeight;
canvas.width = imgWidth;
ctx.drawImage(imageObj, 0, 0, imageObj.naturalWidth, imageObj.naturalHeight, 0,0, imgWidth, imgHeight);
2
TechMaze