При загрузке изображения в Ruby двоичный файл без каких-либо изменений будет закодирован непосредственно на base-64.
При загрузке изображения в браузере он будет применять некоторую обработку к изображению, прежде чем вы сможете использовать его с холста:
- профиль ICC будет применяться (если файл изображения содержит, что)
- гамма-коррекция (если поддерживается)
к тому времени вы рисуете изображение на холст, значение растрового уже изменились, и не обязательно будет совпадать с битовой картой, которая была закодирована перед загрузкой его в качестве изображения (если у вас есть альфа-канал в файле это может повлиять на значения цвета при рисовании на холст - холст немного странный в этом ..).
По мере изменения значений цвета результирующая строка из холста естественно будет также отличаться, прежде чем вы попадете на этап повторного кодирования растрового изображения (поскольку PNG не имеет потерь, кодирование/сжатие должно быть довольно идентичным, но факторы могут существовать в зависимости от реализации браузера, которые также будут влиять на это. Чтобы проверить, сохранить черный необработанный холст в формате PNG и сравнить с похожим изображением из вашего приложения - все значения должны быть равны 0, включая альфа и одинаковые размеры конечно).
Единственный способ избежать этого - напрямую обращаться к двоичным данным. Это, конечно, немного избыточный (как правило, по крайней мере) и относительный медленный процесс в браузере.
Возможное решение, которое работает в некоторых случаях, заключается в удалении любого профиля ICC из файла изображения. Чтобы сохранить изображение из Photoshop без ICC, выберите «Сохранить для Интернета» в меню файла.
делает изображение выглядеть так же, если смотреть? – dandavis
Да, это выглядит так же, если я декодирую base64 в Ruby и сохраняю необработанные данные в PNG-файле. –