Спецификация HTML5 поощряет производителей браузеров использовать то, что называется Premultiplied Alpha
.По сути это означает, что пиксели хранятся в 32-битных целых числах, где каждый канал содержит 8-битное значение цвета.По соображениям производительности Premultiplied Alpha используется браузерами.Это означает, что он предварительно умножает значения цвета на основе альфа-значения.
Вот пример.У вас есть цвет, такой, что значения для RGB 128
, 64
, 67
.Теперь, для более высокой производительности, значения цвета будут предварительно умножены на альфа-значение.Таким образом, в случае, если значение альфа равно 16
, все значения цвета будут умножены на 16/256
(= 0.0625
).В этом случае результирующими значениями для RGB станут 8
, 4
, 4.1875
(округленные до 4
, поскольку значения цвета пикселей не являются плавающими).
Проблема проявляется, когда вы точночто ты здесь делаешь;установка цветовых данных с конкретным альфа-значением, а затем возврат фактических значений цвета.Предыдущий синий цвет 4.1875
, округленный до 4
, станет 64
вместо 67
при вызове getImageData()
.
Именно поэтому вы видите все это, и оно никогда не будетизменить, если базовая реализация в движке браузера не изменит использование цветовой системы, которая от этого не страдает.