Sinnloser 'Andromeda und volkard haben Langeweile' Thread
-
Ich muss in einem Web-Service ein paar Bitmaps mit dynamischem Inhalt erzeugen.
Dazu würde ich gerne HTML verwenden (weil Standard und halbwegs einfach zu modifizieren).
Dazu brauche ich natürlich ein Teil das mir aus dem HTML ne schöne Bitmap bastelt (mit Transparenz!).Ich hab' jetzt mal das "HtmlRenderer" Package eingebunden:
https://www.nuget.org/packages/HtmlRenderer.WinForms/Dummerweise ist na bloss der CSS-Support reichlich unterirdisch. Es funktioniert nichtmal das Ausrichten von Text an der Baseline des Parent Elements ("
vertical-align: baseline;
", was sogar Default ist - bzw. halt sein sollte).Und jetzt suche ich nach Alternativen.
Voraussetzungen:
- Sollte schnell zu integrieren sein.
- Muss vollständig "non-interactive" laufen können.
- Darf keine Probleme machen wenn es in nem Service-Prozess läuft.
- "Relativ" schnell & geringer Overhead pro "render to bitmap" Aufruf (ne einfache Seite mit 5-10 Texten und 5-10 kleinen Bildern sollte in 320x240 nicht länger als 100ms brauchen).
- Muss Files (Bilder) von Disk nachladen können (muss nicht per Callback sein, wenn relativ vom Current-Directory gesucht wird reicht es auch).
- Muss transparente Bitmaps erzeugen können. Output z.B. entweder als .NET Bitmap oder als PNG in nem MemoryStream.Wenns nicht anders geht darf das ganze auch ein Command-Line Utility sein.
Bzw. falls jemand etwas weiss was statt HTML ein anderes Text-basiertes Format verwendet mit dem sich halbwegs einfach Dinge "hübsch layouten" lassen, das ginge wohl genau so. Ich habe auch schon an XAML gedacht. Bloss hab ich da überhaupt keinen Renderer gefunden der problemlos in einem Service-Prozess verwendbar wäre.
-
rohdaten in html sind textformat, oft base64 oder so.
musst also im ersten schritt aus text binary machen.
-
Was für Rohdaten? Base64? Binary? Dafuq?
Ich will HTML rendern (=das was Browser machen wenn sie Webseiten aufm Bildschirm anzeigen tun), und als Ergebnis ne Bitmap haben. Quasi nen "Screenshot" dessen was mir der Browser anzeigen würde wenn ich besagtes HTML in ein File speichern und dann mit nem Browser aufmachen würde.
EDIT: Ein Beispiel sagt mehr als 42 Worte. Monentan sieht das so aus, und dir markierte Zeile will ich durch was besseres ersetzen.
string html = BuildSomeHtmlString(); using (Graphics g = Graphics.FromImage(myBitmap)) { g.TextRenderingHint = TextRenderingHint.AntiAlias; HtmlRender.RenderGdiPlus(g, html, PointF.Empty, new SizeF(Width, Height), null, null, HtmlImageLoadEventHandler); // <----------------------- DAHIER }
-
hustbaer schrieb:
Was für Rohdaten? Base64? Binary?
Ne Bitmap kann üblicherweise jedes Byte enthalten, Werte zwischn 0 und 255.
Die kannste aber nicht einfach in HTML packen, ohne irgendeine Form von umkodierung. Siehe: http://stackoverflow.com/questions/2429934/is-it-possible-to-put-binary-image-data-into-html-markup-and-then-get-the-image
-
Andromeda schrieb:
hustbaer schrieb:
Was für Rohdaten? Base64? Binary?
Ne Bitmap kann üblicherweise jedes Byte enthalten, Werte zwischn 0 und 255.
Die kannste aber nicht einfach in HTML packen, ohne irgendeine Form von umkodierung. Siehe: http://stackoverflow.com/questions/2429934/is-it-possible-to-put-binary-image-data-into-html-markup-and-then-get-the-imageDanke.
Ich hätte husti nicht besser auf die Palme rendern können.
Er braucht im Prinzip einen Roboter, der auf dem PC eine von ihm per Programm angegebene Webseite aufmacht und dann mit der Kamera das Monitorbild vom Browser knipst und dann das geknipste Bild hochlädt. Wenns geht ohne Bastelaufwand mit Lego.
-
volkard schrieb:
Andromeda schrieb:
hustbaer schrieb:
Was für Rohdaten? Base64? Binary?
Ne Bitmap kann üblicherweise jedes Byte enthalten, Werte zwischn 0 und 255.
Die kannste aber nicht einfach in HTML packen, ohne irgendeine Form von umkodierung. Siehe: http://stackoverflow.com/questions/2429934/is-it-possible-to-put-binary-image-data-into-html-markup-and-then-get-the-imageDanke.
Ich hätte husti nicht besser auf die Palme bringen können.
Ick glaube der Freak braucht das.
Mal abwarten was jetzt kommt.
-
Nein, ich brauch das nicht.
Ich glaube auch nicht dass sonst jemand das braucht.
Ich glaube auch nicht dass Andromeda verstanden hat worum es geht.volkard schrieb:
Danke.
Ich hätte husti nicht besser auf die Palme rendern können.
Du befindest es jetzt also schon für nötig mich in meinen eigenen Threads gezielt zu verarschen?
Echt jetzt?
Was ist eigentlich kaputt bei dir?volkard schrieb:
Er braucht im Prinzip einen Roboter, der auf dem PC eine von ihm per Programm angegebene Webseite aufmacht und dann mit der Kamera das Monitorbild vom Browser knipst und dann das geknipste Bild hochlädt.
Nein. Es geht nicht um Webseiten. Es geht um die Erstellung von "hübschen Bildern" mit bestimmten Daten drinnen. Lies meine Beschreibung nochmal, ganz langsam und aufmerksam, vielleicht verstehst du es dann.
-
.
-
volkard schrieb:
Er braucht im Prinzip einen Roboter, der auf dem PC eine von ihm per Programm angegebene Webseite aufmacht und dann mit der Kamera das Monitorbild vom Browser knipst und dann das geknipste Bild hochlädt. Wenns geht ohne Bastelaufwand mit Lego.
Aber nur über irgendeine krasse Enterprise-RESTful API die QR-Codes verwendet.
Darunter geht gar nix. Gigahertz und Gigabytes brauchen schließlich eine Berechtigung.
-
Das mit base64 codiertem HTML ist Quatsch. Kommt höchstens mal ganz selten in äußerst zweifelhaftem code vor, und dann ist es Javascript und nicht HTML.
Das mag vielleicht mit favicons benutzt werden, aber wenn schon, drücke dich korrekt und exakt aus, Andromeda.
-
hustbaer schrieb:
Du befindest es jetzt also schon für nötig mich in meinen eigenen Threads gezielt zu verarschen?
Echt jetzt?
Was ist eigentlich kaputt bei dir?Du best sehr erwachsen.
volkard schrieb:
Nein. Es geht nicht um Webseiten. Es geht um die Erstellung von "hübschen Bildern" mit bestimmten Daten drinnen.
Und wo ist da der wichtige Unterschied?
-
EOP schrieb:
Das mit base64 codiertem HTML ist Quatsch.
Gar nicht. Siehe hier: https://www.hackerboard.de/-web-design-und-webbasierte-sprachen/39760-bilder-binaer-im-html-code.html
-
@Andromeda, @volkard
Reißt euch zusammen und postet nicht so einen Quatsch.
-
GPC schrieb:
@Andromeda, @volkard
Reißt euch zusammen und postet nicht so einen Quatsch.Husti soll sich mal genauer ausdrücken.
Will er vielleicht eine Webseite in eine Bitmap rendern?
-
hustbaer schrieb:
Ich muss in einem Web-Service ein paar Bitmaps mit dynamischem Inhalt erzeugen.
Geil.
Und zur Vereinfachung erstmal Forenthreads mit dynamischem Inhalt erzeugen..
-
nachtfeuer schrieb:
hustbaer schrieb:
Ich muss in einem Web-Service ein paar Bitmaps mit dynamischem Inhalt erzeugen.
Geil.
Und zur Vereinfachung erstmal Forenthreads mit dynamischem Inhalt erzeugen.."Bitmaps mit dynamischem Inhalt" können eigentlich nur GIFs sein. Wobei bewegt ja nicht das Gleiche wie dynamisch ist.
-
hustbaer schrieb:
Dummerweise ist na bloss der CSS-Support reichlich unterirdisch. Es funktioniert nichtmal das Ausrichten von Text an der Baseline des Parent Elements ("
vertical-align: baseline;
", was sogar Default ist - bzw. halt sein sollte).Wenn dir standardkonformes Rendering wichtig ist, wirst du wohl kaum um einen richtigen Renderer herumkommen.
Bei Trident (MSHtml.dll) bin ich nicht ganz sicher, wie gut sich das mit einem Service verträgt. Man findet zwar allerorten Beispiele über das Rendern mit IHTMLElementRender::DrawToDC(), aber laut MSDN ist das schon seit langem deprecated.
Das Chromium Embedded Framework scheint diesen Anwendungsfall aber ausdrücklich zu unterstützen, cf. https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-off-screen-rendering. Vielleicht solltest du dir das anschauen.
-
nachtfeuer schrieb:
hustbaer schrieb:
Ich muss in einem Web-Service ein paar Bitmaps mit dynamischem Inhalt erzeugen.
Geil.
Und zur Vereinfachung erstmal Forenthreads mit dynamischem Inhalt erzeugen..Wenn du mir etwas mitteilen willst, dann bitte so dass man auch verstehen kann was gemeint ist.
-
@audacia
Hab ich mir schon angesehen.
Kommt nicht wirklich in Frage.
Zu viel Overhead. Einerseits runtime (viel zu langsam - das Erzeugen eines neuen Browser-Objekts haut ordentlich rein) und andrerseits auch bei der Implementierung bzw. beim Deployment (die ganzen Dependencies).
-
hustbaer schrieb:
Zu viel Overhead. Einerseits runtime (viel zu langsam - das Erzeugen eines neuen Browser-Objekts haut ordentlich rein)
Gut, aber dann erzeugst du das halt nur einmal und recyclest es. Sehe ich jetzt kein Problem drin.
hustbaer schrieb:
und andrerseits auch bei der Implementierung bzw. beim Deployment (die ganzen Dependencies)
Ja, das ist schon mit Kanonen auf Spatzen. (Lästigerweise kommt es gerade in Mode, Desktopanwendungen mit Angular oder dergleichen zu schreiben und dann immer mitsamt Browser auszuliefern.)
Ich nehme an, eine Trident-basierte Lösung wäre dir auch nicht recht? Dann vielleicht litehtml zusammen mit dem (Cairo-)Graphikbackend aus litebrowser?
Edit: Ich sehe gerade, daß du litebrowser gar nicht brauchst, weil in litehtml schon Renderer für Cairo, GDI und GDI+ enthalten sind.
-
audacia schrieb:
Gut, aber dann erzeugst du das halt nur einmal und recyclest es. Sehe ich jetzt kein Problem drin.
Ich vermeide statische/globale Dinge gerne wenn möglich. Generell, und nochmal ganz speziell bei Services. Was wenn sich das Teil nach 10000 Requests weghängt? Oder leakt oder...
audacia schrieb:
Ich nehme an, eine Trident-basierte Lösung wäre dir auch nicht recht?
Die Ansprüche an die Layout-Engine sind nicht so hoch - mehr als "so gut wie nix" wäre halt schön. Da reicht das was Trident kann locker.
Nur will ich nicht wirklich eine komplette Browser-Engine (inklusive JS-Interpreter etc.) hochziehen, wenn ich eigentlich nur den Layout/Rendering Teil für HTML+CSS brauche und sonst nix.
Kann man den reinen Rendering-Teil von Trident "so" ansprechen? Und kann man das dann auch aus nem Service machen welches von IIS gehostet wird?
audacia schrieb:
Dann vielleicht litehtml zusammen mit dem (Cairo-)Graphikbackend aus litebrowser?
Gibt's dafür fertige .NET Bindings (oder gleich nen fertigen OO Wrapper)?
Wenn nicht, dann steht der Aufwand wohl nicht dafür.Das ganze bewegt sich in einer Grössenordnung wo ich schätze dass ich den nötigen Rendering-Code wahrscheinlich in nem Tag oder so mit GDI+ (
System.Drawing
) implementiert bekomme. Der Nachteil dieser Lösung ist dann bloss dass Änderungen am Layout dann viel mühsamer werden, als wenn das ganze HTML ist das aus nem Razor-Template generiert wird.
Und Änderungen werden sicher noch ein paar kommen. Zwar hoffentlich nicht viele, und hoffentlich keine groben, aber mit 2-3 "mittleren" Änderungen rechne ich auf jeden Fall.