Подтвердить что ты не робот

Масштабирование холста drawImage

Я пытаюсь масштабировать изображение пропорционально холсту. Я могу масштабировать его с фиксированной шириной и высотой так:

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

Но я хочу только изменить размер и пропорционально изменить размер. Что-то вроде следующего:

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

Я искал всюду, о чем я могу думать и не видел, если это возможно.

4b9b3361

Ответ 1

context.drawImage(imageObj, 0, 0, 100, 100 * imageObj.height / imageObj.width)

Ответ 2

решение @TechMaze неплохое.

вот код после некоторой корректности и введения события image.onload. image.onload слишком важна, чтобы воздерживаться от любых искажений.

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);
}
}

Ответ 3

И если вы хотите правильно масштабировать изображение в соответствии с размером экрана, вот математика, которую вы можете сделать: ЕСЛИ ВЫ НЕ ИСПОЛЬЗУЕТЕ JQUERY, ЗАМЕНИТЕ $(window).width с соответствующей эквивалентной опцией.

                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);