#javascript #html #algorithm
#javascript #HTML #алгоритм
Вопрос:
Я нашел следующий скрипт для обработки размытого изображения для изображения с javascript. Я воспроизвел образец, но я не понял, как небольшая часть этого скрипта может работать нормально, я покажу сценарий:
var gaussianBlur = function() {
var data = ctx.getImageData(0,0,canvas.width,canvas.height);
var px = data.data;
var tmpPx = new Uint8ClampedArray(px.length);
tmpPx.set(px);
for (var i = 0, len= px.length; i < len; i ) {
if (i % 4 === 3) {continue;}
px[i] = ( tmpPx[i]
(tmpPx[i - 4] || tmpPx[i])
(tmpPx[i 4] || tmpPx[i])
(tmpPx[i - 4 * data.width] || tmpPx[i])
(tmpPx[i 4 * data.width] || tmpPx[i])
(tmpPx[i - 4 * data.width - 4] || tmpPx[i])
(tmpPx[i 4 * data.width 4] || tmpPx[i])
(tmpPx[i 4 * data.width - 4] || tmpPx[i])
(tmpPx[i - 4 * data.width 4] || tmpPx[i])
)/9;
};
// data.data = px;
ctx.putImageData(data,0,0);
delete tmpPx;
btnBlur.removeAttribute('disabled');
btnBlur.textContent = 'Blur'; }
Эта функция ( gaussianBlur()
) запускается для кнопки html, поэтому при нажатии на нее она обработает изображение, чтобы оно стало размытым, и этот процесс будет повторяться в соответствии с количеством нажатий на кнопку. Часть кода, которую я не понимаю, заключается в том, что когда он завершает цикл for, все математические операции были сохранены в px
переменной, но в следующей строке кода ctx.putImageData(data,0,0);
эта data
переменная не принимает новую измененную переменную px
. Итак, мне интересно, как возможно, что холст может отображаться с размытым изображением, если data
переменная не изменила свой data
компонент (потому data.data = px
что, как показано в первых строках gaussianBlur
функции).
На мой взгляд, чтобы понять этот код, я бы поставил a data.data = px;
после цикла for , с помощью этой строки кода я говорю, что new px
будет установлен для data.data
переменной. И с ot без этого кода строки алгоритм работает. Поэтому я не понимаю, почему он работает, несмотря data.data
на то, что не задается новым px
значением. Пожалуйста, помогите мне понять это.
Заранее спасибо
Комментарии:
1.
px
ссылается на то жеUint8ClampedArray
, чтоdata.data
и ссылки. Все непримитивные типы в javascript являются ссылками.2. Я не уверен, что это на самом деле размытие по Гауссу, а не просто размытие в рамке?
Ответ №1:
Что происходит, так это то, что px
на самом деле это тот же объект, data.data
что и, что означает, что все изменения px
вступают в силу в объекте, который, по вашему мнению, является просто копией. Посмотрите на этот простой пример:
// We create an object 'x' with an array of data
var x = {
data :[ 0, 1]
};
// Assign x.data value to 'p'
var p = x.data;
console.log(p); // [0, 1]
// Then we change one of the array's values to 'Xpto'
p[1] = "Xpto";
// Now look what happened to x.data
console.log(x.data); // [0, "Xpto"]
Вот почему ваш код не работает. px
это не копия, это ссылка.
Комментарии:
1. Спасибо, теперь я понимаю, на каких страницах я могу увидеть эту документацию? (о ссылках на js и о том, как это работает)