https://developer.mozilla.org/ru/docs/Web/API/Canv...
https://github.com/mdn/dom-examples/blob/master/ca...
Тонкий намек на возможное решение.
Самым сложным будет палитру прописывать + разлиновать исходник.
На примере: верхняя сторона - красный цвет, левая - зеленый, правая - синий.
У нас есть область замены - 3 штуки. Каждая из областей находит определенный цвет и заменяет его на цвет из палитры(тут главное в canvas API вникнуть, чтобы вернуть как было или два канваса, где верхний меняется, а нижний остается базовым).
Ну, это если в общем расписывать, но, думаю, принцип понятен.