Я недавно растянул градиент по холсту, используя массив данных ImageData
;то есть методы ctx.getImageData()
и ctx.putImageData()
, и подумал: «Это мог бы быть действительно эффективный способ оживить холст, полный движущихся объектов».Поэтому я включил его в свою основную функцию вместе с оператором requestAnimationFrame(callback)
, но тогда все стало странным.Лучшее, что я могу сделать при описании, это сказать, что самый левый столбец пикселей на холсте дублируется в крайнем правом столбце пикселей, и в зависимости от того, какие координаты вы указали для get
и put
ctx
методы, это может иметь причудливые последствия.
Я начал с методов get и put, нацеливающих холст на 0, 0
примерно так:
imageData = ctx.getImageData( 0, 0, cvs.width, cvs.height );
// here I set the pixel colors according to their location
// on the canvas using nested for loops to target the
// the correct imageData array indexes.
ctx.putImageData( imageData, 0, 0 );
Но я сразу заметил правую сторонухолст был не прав.Как будто градиент начался заново, и последний пиксель по какой-то причине не был затронут:
Таким образом, при уменьшении моя область рисования изменилаput
Координаты ImageData, чтобы получить некоторое пространство между нарисованным изображением и краем холста, и я изменил get
, чтобы исключить эту линию на правом краю холста:
imageData = ctx.getImageData( 1, 1, cvs.width, cvs.height );
for ( var x = 0; x < cvs.width - 92; x++ ) {
for ( var y = 0; y < cvs.height - 92; y++ ) {
// array[ x + y * width ] = value / x; // or similar
}
}
ctx.putImageData( imageData, 2, 2 );
Довольно!Но не так ... Поэтому я воспроизвел его в codepen .Может ли кто-нибудь помочь мне понять и преодолеть это поведение?
Примечание. Кодовое поле имеет уменьшенную область рисования.Если вы измените координаты get
на 0, вы увидите, что он в основном ведет себя так же, как в первом примере, но с пробелом между ожидаемым квадратом и неожиданной линией.Тем не менее, я оставил get
на 1 и put
на нуле для самого интересного поведения.