Если бы мне пришлось угадывать, я бы сказал, что значение красного канала было округлено до некоторого недопустимого значения.Обратите внимание (на исходном изображении), что все области с ошибками в целом намного ярче, чем области, которые обрабатываются должным образом.
Возможно, он выполняет какую-то проверку предела, обнуляя красное значение пикселей в местах, гдеИсходное значение красного цвета + 128 превысит максимальное значение, используемое для представления компонентов цвета (возможно, с использованием uint 8).
Я никогда раньше не использовал холст HTML5, но если вы сможете сэмплировать цвет каждого пикселя, выможет быть в состоянии подавить его, угадав максимальное значение и проверив, чтобы вы не превышали его при увеличении цветового компонента этого конкретного пикселя.
Попробуйте это:
// Apologies, my JavaScript is very rusty, and this isn't how I would do this.
for (var i = 0, l = matrix.data.length; i < l; i += 4)
{
var current_red = matrix.data[i];
var new_red = 0;
if((current_red + delta) > 255) new_red = 255;
else if((current_red - delta) < 0) new_red = 0;
else new_red = current_red + delta;
}
// What I would do is this:
for (var i = 0, l = matrix.data.length; i< l; i+=4)
{
// I don't know if JS has a clamp function :D
matrix.data[i] = clamp(matrix.data[i] + delta, 0, 255);
}