2017-01-08 12 views
1

Я создал фильтр-плагин для Snap, который предназначен для возврата дискретных значений 1 для пикселя со значениями (> = 0,5,> = 0,5,> = 0,5) и 0 для значений (< 0.5, < 0.5, < 0.5)Дискретные значения (0/1) из оттенков серого

В качестве вспомогательного средства для отладки я использую линейный градиент от белого до черного. enter image description here

В этом градиенте, крайние левые пиксели (1,1,1), самые правые пиксели (0,0,0) и центр пикселей (0.5,0.5,0.5)

Поэтому, я ожидал, приложенное плагин рассекать градиент в середине оставляя половину его полностью белым, а половина ее полностью черный, но мой выход возвращает неправильные значения, как показано на рисунке ниже:

enter image description here

Как видите, около трети градиента белого цвета, а две трети - черные, а не равная доля черно-белого.

Вот мой код:

Snap.filter.discrete()

Snap.filter.discrete = function() { 
    var str = "0 1" 
    return Snap.format('<feComponentTransfer>' + 
    '<feFuncR type="discrete" tableValues="' + str + '"/>' + 
    '<feFuncG type="discrete" tableValues="' + str + '"/>' + 
    '<feFuncB type="discrete" tableValues="' + str + '"/>' + 
    '</feComponentTransfer>'); 
}; 

Где я ошибся?

Фидл: https://jsfiddle.net/z7a49npn/1/

ответ

3

Это вызван несоответствием между цветовыми пространствами по умолчанию, используемых для градиентов и фильтров в SVG: SRGB и linearRGB соответственно. Если вы добавите

color-interpolation-filters="sRGB" 

к фильтру - все должно работать.

+0

Это сработало для меня! Я этого не ожидал !! Вы добавили годы в мою жизнь. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^