2017-09-20 2 views
3

J'essaie de prendre l'image qui est 1280x960 et la redimensionner en utilisant drawImage de sorte qu'il est de 600 pixels de haut. Je travaille sur le rapport que je pense que je dois y parvenir, mais ne sais pas comment appliquer ...drawImage redimensionner l'image à 500px haute

var canvas = document.getElementById('mycanvas'); 
 
var ctx = canvas.getContext('2d'); 
 
var img = new Image(); 
 
img.onload = function() { 
 
    canvas.height = this.height; 
 
    canvas.width = this.width; 
 
    
 
    ratio = canvas.height/canvas.width; 
 
    
 
    console.log(canvas.width + 'x' + canvas.height + ' | ratio = ' + ratio); 
 
    
 
    ctx.drawImage(img, 0, 0, 300, 500); 
 
} 
 
img.src = 'https://c.slashgear.com/wp-content/uploads/2015/06/dxo-one-sample-3-1280x960.jpg';
<canvas id="mycanvas"></canvas>

Comment puis-je spécifier la taille de l'image résultante, ce qui rend la largeur automatique? Je veux finalement que cette fonction redimensionne n'importe quelle image à 500 pixels de haut.

Répondre

1

est ici une solution, un rond-point de peu, mais semble fonctionner. J'ai créé une nouvelle image en utilisant toDataURL() de la toile de taille d'origine. Bien que la nouvelle image soit réduite, la dimension totale est toujours celle de l'image originale, de sorte que l'espace restant est transparent. Ensuite, je définis et clip cette image dans une nouvelle toile. La toile résultante a l'image correctement dimensionnée qui peut être copiée et collée avec la dimension désirée.

Si l'extrait ci-dessous ne montre pas l'image dans la nouvelle toile, s'il vous plaît essayer le violon suivant qui semble bien fonctionner: https://jsfiddle.net/jfeferman/u80fhy0z/

var canvas = document.getElementById('mycanvas'); 
 
var ctx = canvas.getContext('2d'); 
 
var img = new Image(); 
 
img.crossOrigin = "Anonymous"; 
 
img.onload = function() { 
 
    canvas.height = this.height; 
 
    canvas.width = this.width; 
 
    
 
    ratio = canvas.height/canvas.width; 
 
    
 
    console.log(canvas.width + 'x' + canvas.height + ' | ratio = ' + ratio); 
 
    
 
    ctx.drawImage(img, 0, 0, 500/ratio, 500); 
 
    
 
    var newImage = new Image(); 
 
    newImage.crossOrigin = "Anonymous"; 
 
    newImage.src = canvas.toDataURL(); 
 
    
 
    var newCanvas = document.getElementById("newcanvas"); 
 
    newCanvas.height = 500; 
 
    newCanvas.width = 500/ratio; 
 
    var newCtx = newCanvas.getContext('2d'); 
 
    newCtx.drawImage(newImage, 0, 0, 500/ratio, 500, 0, 0, 500/ratio, 500); 
 
} 
 
img.src = 'https://c.slashgear.com/wp-content/uploads/2015/06/dxo-one-sample-3-1280x960.jpg';
#mycanvas { 
 
    display: none; 
 
}
<canvas id="newcanvas"></canvas> 
 
<canvas id="mycanvas"></canvas>

+0

Merci beaucoup! Cela ressemble à ça fonctionne très bien. Je suis juste en train de le faire maintenant – fightstarr20

+0

Je me bats pour que cela fonctionne en dehors de JSFiddle, que fait la déclaration crossOrigin? – fightstarr20

+0

Avoir modifié légèrement ceci pour accepter une entrée de fichier d'un bouton de téléchargement qui ne fonctionne pas, ont créé une nouvelle question https://stackoverflow.com/questions/46329669/drawimage-resize-image-with-aspect-ratio-not- working-from-file-upload-input – fightstarr20

1

J'ai appliqué le rapport à votre appel à drawImage et il semble fonctionner:

ctx.drawImage(img, 0, 0, 500/ratio, 500); 

var canvas = document.getElementById('mycanvas'); 
 
var ctx = canvas.getContext('2d'); 
 
var img = new Image(); 
 
img.onload = function() { 
 
    canvas.height = this.height; 
 
    canvas.width = this.width; 
 
    
 
    ratio = canvas.height/canvas.width; 
 
    
 
    console.log(canvas.width + 'x' + canvas.height + ' | ratio = ' + ratio); 
 
    
 
    ctx.drawImage(img, 0, 0); 
 
    canvas.style.width = 500/ratio + "px"; 
 
    canvas.style.height = 500 + "px"; 
 
} 
 
img.src = 'https://c.slashgear.com/wp-content/uploads/2015/06/dxo-one-sample-3-1280x960.jpg';
<canvas id="mycanvas"></canvas>

+0

Il fait, mais l'image résultante est encore 1280x960 – fightstarr20

+0

Étrange, ce n'est pas le résultat que je reçois de l'extrait ci-dessus. Je vois l'image avec la dimension ajustée. En utilisant le dernier navigateur chrome. – jfeferman

+0

Si je clique droit et copie l'image résultante dans photoshop il est toujours 1280x960 avec un fond noir – fightstarr20