Forum: PC-Programmierung svg-Graphik-Objekte von Hand bearbeiten


von Uhu U. (uhu)


Lesenswert?

Ich habe einen Stempel für Fotos als svg-Graphik gebastelt und ein 
Skript dazu, das Textvariable im Stempel setzt und dann den Stempel in 
eine png-Graphik mit der Breite des Fotos umwandelt, die im letzten 
Schritt unten ins das Foto geklatscht wird.

Das funktioniert so weit ganz schön, aber mit dem Essen kommt 
bekanntlich der Appetit, denn für Querformat-Bilder produziert die 
Methode übermäßig große Stempel, wenn der für Hochformat ausgelegt ist 
und von Bildern mit "unorthodoxen" rechteckigen Formaten ganz zu 
schweigen.

Man müßte also Elemente des Stempels skalieren und den (dunklen) 
Hintergrund in der y-Achse verzerren, um den Stempel passend zum 
Seitenverhältnis des Bildes zu skalieren.

Der Stempel selbst ist mit Inkscape gemacht - das geht nach etwas 
Einarbeitung wirklich sehr schön. Allerdings sind die Koorinaten der 
Elemente und die Transformationsmatrizen mit greulich krummen Werten 
besetzt und zur manuellen Bearbeitung wäre es sehr schön, wenn man die 
einzelnen Gruppen, aus denen der Stempel besteht, jeweils in den ++ - 
Quadranten verschieben könnte, so daß die kleinste x- und y-Koordinate 
jeweils 0 ist.

Dann könnte man die Transformationsmatrizen relativ einfach 
modifizieren, um den gewollten Effekt zu bekommen.

Gibts irgendwelche Werkzeuge, mit denen man solche Transformationen 
automatisch und gruppenweise machen kann?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> Ich habe einen Stempel für Fotos als svg-Graphik gebastelt und ein
> Skript dazu, das Textvariable im Stempel setzt und dann den Stempel in
> eine png-Graphik mit der Breite des Fotos umwandelt, die im letzten
> Schritt unten ins das Foto geklatscht wird.
>
> Das funktioniert so weit ganz schön, aber mit dem Essen kommt
> bekanntlich der Appetit, denn für Querformat-Bilder produziert die
> Methode übermäßig große Stempel, wenn der für Hochformat ausgelegt ist
> und von Bildern mit "unorthodoxen" rechteckigen Formaten ganz zu
> schweigen.
>
> Man müßte also Elemente des Stempels skalieren und den (dunklen)
> Hintergrund in der y-Achse verzerren, um den Stempel passend zum
> Seitenverhältnis des Bildes zu skalieren.
>
> Der Stempel selbst ist mit Inkscape gemacht - das geht nach etwas

Oje, Inkscape...

> Einarbeitung wirklich sehr schön. Allerdings sind die Koorinaten der
> Elemente und die Transformationsmatrizen mit greulich krummen Werten
> besetzt und zur manuellen Bearbeitung wäre es sehr schön, wenn man die
> einzelnen Gruppen, aus denen der Stempel besteht, jeweils in den ++ -
> Quadranten verschieben könnte, so daß die kleinste x- und y-Koordinate
> jeweils 0 ist.
>
> Dann könnte man die Transformationsmatrizen relativ einfach
> modifizieren, um den gewollten Effekt zu bekommen.
>
> Gibts irgendwelche Werkzeuge, mit denen man solche Transformationen
> automatisch und gruppenweise machen kann?

Man kann Elemente zu Gruppen zusammenfassen (<g>) und Transformationen 
auf die ganze Gruppe anwenden.

Was Inkscape erzeugt ist allerdings nicht wirklich hilfreich, weil es 
die Trafos in jedes ELement kopiert, wie CSS-Eigenschaften übrigens 
auch.

1) Beim Sodipodi-Zeug beim SChreiben von SVG deaktivieren,
   brauch kein Mensch.

2) Rundungswerte für Koordinaten hochsetzen, 10 Nachkommastellen braucht
   ebenfalls niemand, es sei denn bei komplett wahnsinnigen Zeichnungen
   oder Skalierungen.

Falls du Trafos zerlegen willst, dafür gibt es Tools. Dürfte bei 
rechtiwinkligen Trafos aber kein Problem sein.

von Uhu U. (uhu)


Lesenswert?

Blöd ist, daß relative Linien und absolute Bezierkurven innerhalb eines 
Pfades durcheinander gehen, wie Kraut und Rüben.

Der Sodipodi-Kram juckt wenig.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Inkscape-Einstellungen -> SVG Ausgabe -> Relative Koordinaten erlauben 
deaktivieren. Erzwinge Kommandowiederholung deaktivieren kann ggf. auch 
nützlich sein.

Ansonsten würde ich doch eher beim "Stempel-Prozess" ansetzen, man kann 
doch meist dort eh eine Zielgröße angeben, wenn du also etwas mehr 
Details über dein Skript verrätst kommt man eventuell zu einer 
komfortableren Lösung als verändern der Eingangsdaten ...

von Uhu U. (uhu)


Lesenswert?

Ich habe mir jetzt einfach zwei Stempel-Templates gemacht, eins für 
Hoch- und eins für Querformat. (In der Q-Version sind einfach Logos und 
Texte kleiner und der Hintergrund-Gradient entsprechend niedriger.)

Das Skript sieht jetzt nach, ob das Bild hoch- oder querformatig ist und 
wählt dann das passende Template aus.

Mal sehen, ob das reicht.


Auf jeden Fall: die Möglichkeiten von svg beeindrucken. Stempel ohne 
Skalierungsartefakte sehen einfach besser aus, als welche, die aus einer 
Raster-Maske hingefrickelt sind.

von Uhu U. (uhu)


Lesenswert?

Läubi .. schrieb:
> Inkscape-Einstellungen -> SVG Ausgabe -> Relative Koordinaten erlauben
> deaktivieren. Erzwinge Kommandowiederholung deaktivieren kann ggf. auch
> nützlich sein.

Das scheint aber nur für neu gezeichnete Elemente zu wirken. Wenn man in 
einer bestehenden Zeichnung die relativen Koordinaten verbietet und dann 
abspeichert, bleiben die l-Elemente in einem Pfad relativ.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich glaub man muss einmal alles markieren und ein paar Pixel verschieben 
bin aber nicht sicher, da das erst in irgendeiner Version neu 
hinzugekommen ist, ich also mit einer Zeichnung gestartet bin welche 
schon "richtige" Koordinaten hatte. Ob ich dann die Änderung nochmal 
durchgeführt habe oder durch "verschieben" das Problem gelöst habe weiß 
ich nicht mehr.

Für zukünftige Zeichnungen aber ggf. dennoch nützlich.

von Uhu U. (uhu)


Lesenswert?

Nachdem ich mich etwas genauer mit svg beschäftigt habe, scheint es das 
Einfachste zu sein, ein kleines Ruby-Skript zu schreiben, das Pfade 
komplett ins Relativ-Format umrechnet. Die ganze Chose kann man dann 
leicht im Editor zusammenstöpseln und mit Transformationsmatrizen 
zurechtbiegen.


Der Stempel besteht aus einem Logo links unten, zwei Texten rechts 
daneben und einem dritten Text am rechten unteren Bildrand. Unter Logo 
und Texten liegt ein grauer Gradient, der unter den unteren 2/3 des 
Logos liegt und nach rechts auf einer Bézierkurve so weit herunter geht, 
daß der rechte Text auch gerade noch davon unterlegt ist - er soll den 
notwendigen Kontrast bereitstellen, damit der Stempel nicht im Bild 
ersäuft. Der Gradient wird mit einem Gauss-Filter weichgezeichnet und 
wirkt auf einem Bild mit hellem Hintergrund wie ein Schatten.

Um diese Konstruktion unabhängig vom Bildformat zu bekommen, müßte der 
linke Block so skaliert werden, daß er ~15% der Bildhöhe bekommt. 
Entsprechend müßte der Text rechts auch nach diesem Maß skaliert werden 
und wenn er am rechten Bildrand verankert ist, dann ist der skalierbare 
Stempel perfekt.

Dann bleibt nur noch, die svg-Komponenten so aufzubauen, daß sie 
möglichst einfach zu skalieren sind, dann könnte das Ganze in ein Skript 
verpackt werden, dem man nur noch Datei und Parameter übergibt, um ein 
in jedem Fall "schön" gestempeltes Bild zu bekommen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> Um diese Konstruktion unabhängig vom Bildformat zu bekommen, müßte der
> linke Block so skaliert werden, daß er ~15% der Bildhöhe bekommt.
> Entsprechend müßte der Text rechts auch nach diesem Maß skaliert werden
> und wenn er am rechten Bildrand verankert ist, dann ist der skalierbare
> Stempel perfekt.

Splitte doch die beiden Teile einfach in zwei Dateien, wieso so 
umständlich. Dann in deinem "Stempel-Prozess" die gewünschten 
Skalierungsfaktoren berechnen und beides skaliert und in den gewünschten 
"Ecken" auf das Bild zeichnen lassen.

Das Skalieren an sich sollte die Lib (welche du ja partout nicht nennen 
magst), eigentlich selbst übernehmen.

: Bearbeitet durch User
von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Läubi .. schrieb:
> Splitte doch die beiden Teile einfach in zwei Dateien, wieso so
> umständlich.

Gute Idee... Nur der durch eine Bézierkurve begrenzte Gradient, der 
ausreichend Kontrast für Texte und Logo erzwingt, tanzt etwas as der 
Reihe, denn der muß in x und y verschieden skaliert werden. (Im Moment 
behelfe ich mir mit zwei Versionen des ganzen Stempels. Das klappt 
einigermaßen, wenn das Bildformat vom gängigen Fotoformat nicht all zu 
sehr abweicht und wenn es nicht gar zu klein ist, aber diese Randfälle 
müßte man so oder so gesondert abhandeln.)

> Das Skalieren an sich sollte die Lib (welche du ja partout nicht nennen
> magst), eigentlich selbst übernehmen.

Siehe Anhang.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> diese Randfälle müßte man so oder so gesondert abhandeln

Das sit immer ein Problem, da muß man aber auch mal überlegen ob man 
wirklich 2000x5 px Grafiken stampen muss ;-)


composite (http://www.imagemagick.org/script/composite.php) unterstützt 
doch sogar Transformationsmatrizen, damit kann man doch so ziemlich 
alles erschlagen. Ich würde auch mal sehen ob das nicht direkt SVG 
versteht wenn ich das richtig sehe konvertierst du den Stempel erst in 
ein PNG, das ist einerseits umständlich und andererseits ggf. ein 
Qualitätsverlust.

Ansosnten wäre eine eSkript oder Programiersprache eventuell besser 
geeigent als ein Shell-Skript auf lange Sicht.

von Uhu U. (uhu)


Lesenswert?

Läubi .. schrieb:
> Das sit immer ein Problem, da muß man aber auch mal überlegen ob man
> wirklich 2000x5 px Grafiken stampen muss ;-)

So extrem ist das nicht, aber schon weniger schräge Verhältnisse bringen 
kein ästhetisch akzeptables Resultat mehr - ich hoffe, du verstehst, was 
gemeint ist ;-)

> Ich würde auch mal sehen ob das nicht direkt SVG
> versteht wenn ich das richtig sehe konvertierst du den Stempel erst in
> ein PNG, das ist einerseits umständlich und andererseits ggf. ein
> Qualitätsverlust.

Das ist die Theorie. Die Praxis ist, daß composite mit dem Alfakanal von 
svg nicht klar kommt.

: Bearbeitet durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> mit dem Alfakanal von svg

Du meinst die Halbtransparenz bei Gradienten? Ansonsten gibt es bei SVG 
keinen Alpha-Kanal. Wenn das so ist, würde ich mal einen Bugreport bei 
Imagemagik eröffnen, mit Glück ist es dann in folgenden Versionen 
gefixt.

Uhu Uhuhu schrieb:
> aber schon weniger schräge Verhältnisse bringen kein ästhetisch
> akzeptables Resultat mehr

Das war zwar extrem, aber auch "gutmütige Verhältnisse von 4:3 sind bei 
40x30 Pixel sicher nicht brauchbar. Deshalb sollte man sich hier denke 
ich auch auf sinnige Verhältnisse und Pixelgrößen einschränken anstatt 
zu viel Zeit und Energie in ungewöhnliche Verhältnisse zu stecken.

von Uhu U. (uhu)


Lesenswert?

Läubi .. schrieb:
> Du meinst die Halbtransparenz bei Gradienten? Ansonsten gibt es bei SVG
> keinen Alpha-Kanal.

Wie man das nennt, ist egal. Der Effekt ist jedenfalls, daß composite 
der svg einen knalleweißen Hintergrund verpaßt und das Ganze dann in das 
Zielbild hinein klatscht.

> Wenn das so ist, würde ich mal einen Bugreport bei
> Imagemagik eröffnen, mit Glück ist es dann in folgenden Versionen
> gefixt.

Das scheint ein ziemlich alter Hut zu sein - ich habe entsprechende 
Hinweise auf dem Web gefunden.

Auffällig ist auch, daß Inkscape gemessen an den Möglichkeiten, die es 
interaktiv bietet, nicht gerade über üppige Kommandozeilen-Möglichkeiten 
verfügt, aber genau diese Lücke von Imagemagick perfekt abdeckt.

> Das war zwar extrem, aber auch "gutmütige Verhältnisse von 4:3 sind bei
> 40x30 Pixel sicher nicht brauchbar.

Man könnte das Verhalten des Stempels in Richtung solcher Extremfälle 
aber sehr schön modellieren, auch wenn man solche Winzbildchen nicht 
sinnvoll bearbeiten kann. (Die brauchen eh keinen Klauschutz mehr...)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.