Я пытаюсь реализовать функцию кривых в Photoshop, чтобы настроить изображение на моей веб-странице. Я ищу сплайн-интерполяцию в Википедии (https://en.wikipedia.org/wiki/Spline_interpolation), но мне не совсем понятен алгоритм.
Теперь я использую CanvasSpliner (https://github.com/jonathanlurie/canvasSpliner), чтобы создать интерфейс для функции кривых (пример здесь http://me.jonathanlurie.fr/canvasSpliner/)), и у меня есть координаты всех точек в интерфейсе (диапазон значений 0-255 Я использую объект Map для хранения всех этих точек, как показано ниже:
var pixel_map = new Map();
//cs is the CanvasSpliner object, I just demo with releasePoint event
cs.on("releasePoint", function(csObj){
//x_coor, y_coor is the coordinate get from mouseMove event
pixel_map.set(x_coor.toString(), y_coor);
}
Так что, если я сопоставлю все соответствующие точки ввода на объекте Map со всеми пикселями изображения (диапазон значений 0-255) с выводом точек, как показано ниже:
//I match with 3 channels R, G, B
for (let [key, value] of pixel_map) {
if (data[channels_at_xy.R] === key) {
temp_image_data.data[channels_at_xy.R] = value;
}
else if (data[channels_at_xy.G] === key) {
temp_image_data.data[channels_at_xy.G] = value;
}
else if (data[channels_at_xy.B] === key) {
temp_image_data.data[channels_at_xy.B] = value;
}
else if (data[channels_at_xy.A] === key) {
temp_image_data.data[channels_at_xy.A] = data[channels_at_xy.A];
}
else{
temp_image_data.data[channels_at_xy.R] = data[channels_at_xy.R];
temp_image_data.data[channels_at_xy.G] = data[channels_at_xy.G];
temp_image_data.data[channels_at_xy.B] = data[channels_at_xy.B];
temp_image_data.data[channels_at_xy.A] = data[channels_at_xy.A];
}
}
Как другие пиксели, которые не принадлежат объекту карты, будут интерполированы сплайном, я просто оставляю им значение по умолчанию в коде выше? (Например, если у моего объекта Map есть 3 элемента, я могу просто отобразить 3 элемента на 3 соответствующих пикселя, оставив 253 пикселя со значением по умолчанию.). Как я заметил в Photoshop, при использовании кривых будут изменены все пиксели, а не только тот, который соответствует входному значению.