HTML5 canvas как изменить масштаб putImageData

#scale #putimagedata

#html5-canvas #масштаб #putimagedata

Вопрос:

Как изменить putImageData масштаб scale(1.5, 1.5) , если он не работает..

 var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
context.clearRect(0, 0, canvas.width, canvas.height);
context.scale(1.5, 1.5);
context.putImageData(imageData, 0, 0);
  

Ответ №1:

Правильно, ваш код не будет масштабировать существующие чертежи.

context.scale влияет только на новые чертежи, а не на существующие чертежи.

context.putImageData сохраненные исходные пиксели будут помещены обратно на холст, но putImageData не является командой рисования, поэтому ее результаты не будут масштабироваться.

Чтобы масштабировать существующие пиксели, вы должны сохранить пиксели в объект за пределами вашего холста. Внешний объект может быть новым элементом изображения или вторым элементом Canvas.

Пример кода и демонстрация: http://jsfiddle.net/m1erickson/p5nEE /

 // canvas related variables
var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");

// draw a test square
context.fillStyle="red";
context.fillRect(0,0,50,50);

// create an image from the canvas
// clear amp; scale the canvas
// draw the image to the canvas
var imageObject=new Image();
imageObject.onload=function(){

    context.clearRect(0,0,canvas.width,canvas.height);
    context.scale(1.2,1.2);
    context.drawImage(imageObject,0,0);
  
}
imageObject.src=canvas.toDataURL();
  

Комментарии:

1. у меня такая же проблема с этим случаем: второй холст имеет альфа = 0 в некотором пикселе при создании нового изображения со второго холста. альфа исчезла, поэтому она стала черной для пикселя с alpha = 0; как это решить?

2. подождите, аргументы 6 и 7 для PutImage нельзя использовать для увеличения масштаба изображения? Если нет, я не понимаю, о чем говорится в документации , которую они на самом деле делают.

3. @Michael Возможно, вы путаете ctx.drawImage() , чьи последние 2 аргумента действительно масштабируют результат. То, как этот ответ обрамляет его, является хорошей ментальной моделью: команды рисования, такие как drawImage, будут учитывать масштаб, команды put — нет.

4. Предположим, у меня есть массив пикселей, который отображается на холсте с помощью putImageData, затем только для масштабирования мне нужно создать новый ImageObject? Разве это не избыточно? Мы рисуем с помощью putImageData и снова перерисовываем .. Есть ли эффективный способ сделать это?

5. Это довольно умно. Также это кажется мучительно надуманным. Вздох.