Hauptmenü

SVG Icons in RSS PNG / JPG

Begonnen von xenos1984, 16 Mai 2020, 20:14:24

Vorheriges Thema - Nächstes Thema

xenos1984

Mir ist aufgefallen, dass in einigen Beiträgen hier im RSS-Unterforum die Frage aufgetaucht ist, ob man SVG Grafiken in RSS einbinden kann, was scheinbar negativ beantwortet wurde. Mich hat genau die gleiche Fragestellung interessiert, nämlich würde ich gerne farbige SVG Icons in ein mit dem RSS-Modul erzeugtes PNG einbinden, mit einer Syntax der Form "sani_heating@red", also "<ICON>@<COLOR>", wie das ja auch z.B. bei devStateIcon funktioniert. Und siehe da - es geht recht einfach. Zunächst in 99_myUtils.pm:
sub
icon_as_png($)
{
my ($name) = @_;
my $svg = FW_makeImage($name);
my $png;

eval
{
require Image::LibRSVG;
my $rsvg = new Image::LibRSVG();
$rsvg->loadImageFromString($svg);
$png = $rsvg->getImageBitmap();
};

return $png if $png;
return;
}

Dabei nehme ich die bewährte FW_makeImage Funktion, die ein SVG Icon lädt und einfärbt, und habe danach etwas Code aus der Funktion plotAsPng in 98_SVG.pm übernommen, um das Ergebnis in PNG umzuwandeln. Im RSS Layout lässt sich dann sowas einbauen:
img <x> <y> <size> png data {icon_as_png('<ICON>@<COLOR>')}
Also z.B.:
img 60 60 h32 png data {icon_as_png('sani_heating@red')}
Da das eigentlich ziemlich simpel ist, würde es Sinn machen, die Funktionalität direkt in 02_RSS.pm zu integrieren? Mein Code lässt sich vielleicht auch noch eleganter umsetzen - ich habe mangels Erfahrung mit Perl einfach mal kopiert ;)

Dr. Boris Neubert

Hallo xenos1984,

das ist interessant. Kannst Du einen Patch für 02_RSS.pm (inkl. Doku) liefern dafür? Dann würde ich mir das ansehen und in 02_RSS.pm integrieren.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

xenos1984

#2
Hallo Boris,

ich kann es zumindest mal versuchen. Wie sollte das denn in etwa aussehen? Ich sehe da zwei Möglichkeiten, das zu implementieren. Die erste Version wäre, so eine Funktion wie mein icon_as_png in 02_RSS.pm einzubauen, damit man dann
img <x> <y> <size> png data {icon_as_png('<ICON>@<COLOR>')}
in der Layout-Datei haben kann, ähnlich wie das auch schon bei SVG Plots funktioniert. Die andere Version wäre, einen neuen Befehl der Form
icon <x> <y> <size> '<ICON>@<COLOR>'
einzuführen. Das könnte man durch einen weiteren Eintrag in der Fallunterscheidung in RSS_evalLayout und eine neue Funktion RSS_itemIcon umsetzen, die SVG nach PNG konvertiert und das an RSS_itemImg übergibt. Welcher Version würdest du den Vorzug geben?

Viele Grüße,
Xenos

Edit: Dritte Möglichkeit (zusätzlich zu implementieren zu einer der beiden von oben): SVG in img erlauben und die Konvertierung in RSS_itemImg vornehmen. Dann hätte man
img <x> <y> <size> svg data {FW_makeImage('<ICON>@<COLOR>')}

Dr. Boris Neubert

Hallo Xenos184,

Danke, dass Du mithilfst, RSS zu erweitern!

Ich habe mir die Varianten auch durch den Kopf gehen lassen und finde die letzte, die Du hinzugefügt hast, die natürlichste, weil sie den img-Befehl konsequent erweitert. M.E. ergibt sich dann ganz automatisch neben data auch file und url. Es müsste also nur beim Schlüsselwort <imgtype>=svg die sich aus <srctype> <arg> ergebenden Daten nach png gewandelt werden und dann weiter im Code wie gehabt.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

xenos1984

#4
Hallo Boris,

keine Ursache - letztlich habe ich ja auch einen Nutzen davon, von daher Danke für die Programmierarbeit, die da schon dahinter steckt! :)

Was die Umsetzung angeht, bin ich da ganz deiner Meinung. Ich habe mir den Code mal angesehen und so wie es aussieht, gibt es bei url / urlq vs. data auch eine gewisse Code-Doppelung. Letztlich sollte es ja keine Rolle spielen, ob die Daten von einer URL geladen werden oder direkt übergeben, wenn sie danach ohnehin gleich behandelt werden? Deshalb habe ich mir mal erlaubt, das etwas zu bereinigen, und im Zuge dessen die SVG Funktionalität eingebaut. Dokumentiert ist sie auch. Und damit getestet:

img 100 100 h50 png file "./www/images/default/fhemicon.png"
img 200 100 h50 png url "http://svn.fhem.de/trac/export/HEAD/trunk/fhem/www/images/default/fhemicon.png"

img 100 200 h50 svg file "./www/images/fhemSVG/clock.svg"
img 200 200 h50 svg url "http://svn.fhem.de/trac/export/HEAD/trunk/fhem/www/images/fhemSVG/clock.svg"
img 300 200 h50 svg data {FW_makeImage('clock@blue')}

defmod rsstest RSS png localhost ./rsstest.txt
attr rsstest bgcolor ffffff
attr rsstest size 800x600


Das erzeugt mir ein paar hübsche Icons.

Patch ist angehängt.

Viele Grüße,
Xenos

Dr. Boris Neubert

Danke, Xenos!

Bei mir getestet und soeben eingecheckt. Wird ab morgen per Update verteilt.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

xenos1984