Проблемы с кодированием эффектов Illustrator SVG

У меня возникли НАСТОЯЩИЕ большие проблемы с кодированием SVG XML и его воспроизведением в Illustrator, как я и ожидал. Основной проблемой сейчас является эффект feColorMatrix. Я понимаю эффект и то, как матрица изменяет пиксели, но проблема заключается в том, что когда я указываю 0,5 в качестве конечного результата вывода в любой из строк цветового канала, Illustrator не интерпретирует 0,5 как RGB 127, другими словами, 50% значение цвета. Это больше похоже на 0,215, что соответствует 127 десятичным значениям RGB. Вот код:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
    xmlns="http://www.w3.org/2000/svg"
    version="1.2"
    viewBox="0 0 576 432"
    width="576"
    height="432"
    baseProfile="tiny"
    id="NicoleLovesSVG">
    <g id="Canvas">
        <rect
            width="576"
            height="432"
            x="0"
            y="0"
            transform="scale(1,1)"
            id="Canvas-Rect1"
            style="fill:#9d8654;fill-rule:evenodd;" />
    </g>
    <defs>
        <filter id="ShadowFilter-Text1" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" width="200%" height="200%" x="-50%" y="-50%">
            <feColorMatrix type="matrix"  in="SourceAlpha"
                values="0 0 0 0 .5
                    0 0 0 0 0
                    0 0 0 0 0
                    0 0 0 1 0"/>
            <feOffset dx="24.395183950936" dy="24.395183950936" result="shadow"/>
            <feBlend in="SourceGraphic" in2="shadow" mode="normal"/>
        </filter>
    </defs>
    <g
        id="Text1"
        transform="translate(1.1272727272727,297.27272727273) rotate(0) scale(3.5238813920454546,2.642911044034091)"
        style="fill:#003300;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:15px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;"
        filter="url(#ShadowFilter-Text1)">
            <g
                id="Text1-Line1"
                transform="translate(0,0)">
                <path
                    transform="translate(0,0)"
                    vector-effect="non-scaling-stroke"
                    id="Text1-Line1-Glyph1"
                    d="M 0,0 M 46.4,-98.24 L 46.4,-15.68 C 46.4,-8.96 47.466666666667,-3.7333333333333 49.6,-0 L 30.4,-0 C 32.533333333333,-3.7333333333333 33.6,-8.96 33.6,-15.68 L 33.6,-98.24 L 31.36,-98.24 C 21.653333333333,-98.24 12.106666666667,-96.373333333333 2.72,-92.64 L 8.32,-106.72 L 79.68,-106.72 L 74.56,-92.64 C 68.693333333333,-96.48 59.306666666667,-98.346666666667 46.4,-98.24 z" />
            </g>
    </g>
</svg>

Как видите, первый фильтр извлекает SourceAlpha, который полностью черный. Затем цветовая матрица берет это и делает это с первой строкой матрицы:

(a x красный) + (b x зеленый) + (c x синий) + (d x альфа) + e = окончательный красный вывод

подставляем цифры:

(0 x 0) + (0 x 0) + (0 x 0) + (0 x 0) + 0.5 = 0.5

Должно быть 50% красного! Или 127 RGB!!! Я сделал математику, и в Illy это больше похоже на 0,215 = 127 = 50% ??????


person shrimpwagon    schedule 21.11.2011    source источник
comment
Случайная догадка: возможно, это как-то связано с предварительно умноженной альфой?   -  person Phrogz    schedule 22.11.2011
comment
Я так не думаю. Вы можете заменить SourceAlpha на SourceGraphic и получить те же результаты.   -  person shrimpwagon    schedule 22.11.2011


Ответы (1)


Это связано с цветовым пространством, используемым фильтрами, которым по умолчанию является linearRGB.

Вы можете получить желаемое поведение, указав color-interpolation-filters="sRGB" в элементе ‹filter> или непосредственно в элементе ‹feColorMatrix>. См. раздел цветовые интерполяционные фильтры.

person Erik Dahlström    schedule 22.11.2011
comment
Эрик, если бы я был цыпочкой, я бы хотел, чтобы у тебя были мои дети! Огромное спасибо. Вот оно. Я буквально работал над этой проблемой в течение 4 дней, без шуток. - person shrimpwagon; 22.11.2011