Ich habe ein SVG-Bild mit vielen Objekten, gestapelt. Was ich brauche, ist ein endgültiges SVG mit dem gleichen visuellen Ergebnis, aber so, dass ich die Deckkraft jedes Objekts ändern kann, ohne die verborgenen Teile der darunter liegenden Objekte zu enthüllen, sondern nur das „Loch“ dahinter.
Ich habe dieses Diagramm erstellt , um die Anforderung zu veranschaulichen:
Dieses obige Beispiel wurde von Hand mit Inkscape erstellt, wobei jedes Quadrat ausgewählt und so oft dupliziert wurde, wie die Anzahl der Unterschiede ( ctrl+ -) ich benötigte, um die darunter liegenden Objekte zu "schneiden". Diese Methode ist bei einer großen Menge von Objekten sehr schwer anzuwenden.
Jede Software (Adobe Illustrator, Befehlszeilentool ...) oder Methode, die dieses Problem löst, ist willkommen.
Auf Illustrator:
...wählen Sie die Formen aus und verwenden Sie dann die 'Trim'
Schaltfläche im Pathfinder
Fenster.
Trim kann sich bei Objekten mit Transparenz seltsam verhalten, also ...
... wähle die Quadrate aus, dann Object > Flatten Transparency
setze 'Vektoren' auf 100%.
Bild, das es aus dieser anderen Frage veranschaulicht :
Lässt manchmal Flatten Transparency
das untere Objekt ungeschnitten und sitzt unter allem anderen. Wenn dies passiert, können Sie, nachdem Flatten Transparency
alle Ihre Vektorformen eine Deckkraft von 100% haben, einfach diese untere Form und die Formen, die sie überlappen, auswählen und Trim
wie oben verwenden.
Speichern Sie dann als SVG, wenn Sie SVG benötigen. Um das von Ilmari Karonen beschriebene Problem der übereinstimmenden Kanten zu vermeiden, können Sie Object > Transform > Transform Each
jedes Objekt so skalieren, dass es 100,5 % um seinen eigenen Mittelpunkt herum beträgt. Oder Sie könnten jedem Objekt einen sehr dünnen Strich mit einer eigenen Füllfarbe geben (wahrscheinlich ein besserer Ansatz, da idealerweise die kleine Überlappung für alles gleich sein sollte, nicht proportional zur Größe).
Ich habe eine Idee, obwohl ich sicher bin, dass es einen besseren Weg gibt.
Verwendung von Inkscape
Edit -> Preferences
Wählen Sie am unteren Rand der Auswahl Bitmaps
„Einstellen“ Resolution (256)
und „Schließen“.Edit -> Make a Bitmap copy
(es dauert ein wenig, bis das Bild erstellt ist).Path -> Trace Bitmap
nur in der Mode tap
gesetzten Multiple scan: Scans (6, one for each color used plus one for background), Colors (on)
Marke Remove background
.Options tab
Markierung alles aufheben! Senden OK
.Right click
Wählen Sie in der Gruppe Ungroup
.Path -> Break Apart
.Möglicherweise müssen Sie einige Streulinien löschen.
Achten Sie darauf, den Rücken einzustellen Resolution
!. Und lassen Sie mich wissen, ob es für Sie funktioniert.
Ein Problem bei dem Versuch, das zu tun, wonach Sie fragen, ist, dass Ihre Formen am Ende zusammenfallende Kanten haben. Beim Rendern erscheinen solche Kanten oft so, als gäbe es einen schmalen Spalt zwischen den Formen, wodurch der Hintergrund ein wenig durchscheinen kann.
Dafür gibt es zwei Gründe – Anti-Aliasing und Rundung:
Erstens verwenden die meisten SVG-Renderer eine Anti-Aliasing-Implementierung, bei der Pixel entlang der Kante einer Form als teilweise transparent gezeichnet werden, wobei der Grad der Transparenz dadurch bestimmt wird, wie viel von jedem Pixel die Form überlappt. Dies führt normalerweise zu hervorragenden Ergebnissen, aber es ist nicht perfekt, und eine Situation, die seine Ungenauigkeiten aufdecken kann, ist, wenn die Kanten zweier Formen zufällig genau zusammenfallen.
Um zu sehen, warum dies passiert, stellen Sie sich ein Pixel vor, dessen eine Hälfte beispielsweise von einer roten Form bedeckt ist und genau die gegenüberliegende Hälfte von einer grünen Form bedeckt ist, wobei diese beiden Formen auf einem blauen Hintergrund gezeichnet sind. Bei einem „perfekten“ Renderer wäre dieses Pixel zu 50 % rot und zu 50 % grün, ohne dass Blau durchscheint. Was jedoch mit einem echten Renderer passiert, ist, dass er zuerst, sagen wir, die rote Form zeichnet, wodurch das Pixel zu 50 % rot und zu 50 % blau wird. Dann wird die grüne Form auf diesen Hintergrund gezeichnet, wodurch die Hälfte ihrer ursprünglichen Farbmischung durch Grün ersetzt wird und das Pixel zu 25 % rot, 50 % grün und 25 % blau bleibt.
Der andere Grund, warum zusammenfallende Kanten problematisch sein können, liegt darin, dass Renderer normalerweise Gleitkomma-Mathematik verwenden, die kleinen Rundungsfehlern unterliegt. Obwohl die Kanten genau zusammenfallen sollen , können Ungenauigkeiten bei der Berechnung daher ihren tatsächlichen Verlauf ein wenig ändern und eine winzige Lücke hinterlassen. (Dies ist ein größeres Problem beim 3D-Rendering, bei dem solche numerischen Probleme den Renderer im Unklaren darüber lassen können, welche von zwei deckungsgleichen Oberflächen vor der anderen gezeichnet werden soll, aber es kann sich auch auf das 2D-Rendering auswirken.)
Im Prinzip könnte das Anti-Aliasing-Problem vermieden werden, indem zunächst das gesamte Bild ohne Anti-Aliasing mit einer sehr hohen Auflösung (z Kanten. Dies wäre jedoch im Vergleich zum standardmäßigen SVG-Rendering mit Anti-Aliasing eine sehr teure Rendering-Methode, weshalb sie normalerweise nicht verwendet wird. Außerdem würde es Probleme mit numerischer Genauigkeit immer noch nicht vollständig lösen.
Daher besteht die praktische Lösung darin, zusammenfallende Kanten nach Möglichkeit zu vermeiden. Solange Sie sicherstellen, dass sich benachbarte Formen ausreichend überlappen, funktioniert der standardmäßige Anti-Aliasing-Algorithmus gut und Sie sehen keine offensichtlichen Lücken zwischen den Formen.
DA01
Ilmari Karonen
Ignacio Lago