Ich habe versucht, eine bestimmte feDisplacementMap zu generieren und kläglich scheitern. Ich glaube, es liegt daran, dass ich ein fundamentales Missverständnis über den Mechanismus habe. Die SVG 1.1 Spezifikation sagt:Warum ist ein einheitliches Grau keine neutrale DisplacementMap?
Diese Filter primitive die Pixelwerte aus dem Bild von ‚in2‘ verwendet räumlich um das Bild von ‚in‘ zu verdrängen. Dies ist die Transformation durchgeführt werden:
P '(x, y) < - P (x + * Skala (XC (x, y) - 0,5) + y * Skala (YC (x, y) - .5)) Dabei ist P (x, y) das Eingabebild, 'in' und P '(x, y) ist das Ziel. XC (x, y) und YC (x, y) sind die Komponentenwerte des Kanals, der von xChannelSelector und yChannelSelector als bezeichnet wird. Um beispielsweise die R-Komponente von 'in2' zur Steuerung der Verschiebung in x und die G-Komponente von Image2 zur Steuerung der Verschiebung in y zu verwenden, setzen Sie xChannelSelector auf "R" und yChannelSelector auf "G".
Durch meine Lesung bedeutet dies, dass ein neutrales Graubild keine Netto-Pixelbewegung ergeben sollte. Aka in einem Filter mit Skala = 50, ein Pixel bei 100,100 sollte seinen neuen Wert von (100 + 50 * (0,5 - 0,5), 100 + 50 * (0,5-0,5)) = 100,100 erhalten. Wenn ich jedoch eine Graustufe versuche, werden die Pixel nach oben und links vom Quellbild dargestellt.
<svg width="800px" height="600px" >
<defs>
<g id="displacerect">
<rect x="50" y="50" width="300" height="300" fill="rgb(127, 127, 127)"/>
<rect x="90" y="90" width="50" height="50" fill="red">
</rect>
</g>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="rgb(255,255,0)" stop-opacity="1" />
<stop offset="100%"stop-color="rgb(255,0,0)" stop-opacity="1" />
</linearGradient>
<filter id="displaceME" x="0%" y="0%" width="100%" height="100%">
<feImage xlink:href="#displacerect" result="displaceImage"/>
<feDisplacementMap scale="125" xChannelSelector="R" yChannelSelector="G" in="SourceGraphic" in2="displaceImage"/>
</filter>
</defs>
<g filter="url(#displaceME)">
<rect x="50" y="50" width="300" height="300" fill="url(#grad1)"/>
</g>
<use xlink:href="#displacerect" x="400"/>
</svg>
Nach anderen Quellen: die IST-Verlagerungs Karte sollte dieses Bild sein:
Haben Sie eine [MCVE]? –