Bild in HTML durch PHP
Marcel
- php
Hallo,
bezogen auf des Topic habe ich bei Google leider nichts genaues zu meinem Problem gefunden.
Ich versuche Folgendes zu erreichen (alles in einer Datei):
(Pseudo)
<?php
require( 'foobar.php' );
$foobar = new Foobar();
?>
...
<html>
...
<body>
...
<img src="<?php $foobar->zeichne_diagramm(); ?>" />
...
</body>
</html>
Ich habe also eine Klasse Foobar (enthalten in der Datei foobar.php), die ich auf einer Seite einbinde. Von dieser Klasse erzeuge ich mir per new eine Instanz. Inmitten der Webseite soll nun ein Bild eingefügt werden. Dazu würde ich dann eine Methode der Klasse Foobar aufrufen, die mir ein Bild liefert.
Soweit klingt das erstmal nach Nichts. Mein Problem ist aber die Methode, die mir das Bild liefert. Wie hat diese auszusehen? Alles was ich im Netz dazu finde, sind Beispiele, in denen das Bild auf dem Server gespeichert und lediglich der Pfad zum Bild zurückgegeben wird. Mein Dilemma ist, dass ich das Bild nicht zwischenspeichern kann (darf), ich es also von der Methode quasi direkt zurückbekommen muss.
Ich hoffe, dass mein Problem halbwegs verständlich rüber gekommen ist und jemand Rat weiß (und kund tut natürlich :-)
Gruß,
Marcel
Hi!
Da wird so nix!
<img src="<?php $foobar->zeichne_diagramm(); ?>" />
Der Attributwert des src-Attributes ist der Bezeichner für eine (HTTP-) Ressource und nicht die Ressource selbst.
Du kannst aber ein PHP-Script nutzen, um dynamisch eine Grafik zu erzeugen
und dieses Script als Attributwert übergeben.
<img src="diagram_maker.php" alt="Diagram XY" />
Wie man Grafiken in PHP erzeugt, findest DU hier
off:PP
Hallo
Da wird so nix!
<img src="<?php $foobar->zeichne_diagramm(); ?>" />
Doch und mir kam gerade die Erleuchtung. Eigentlich ist es fast genau so, wie du geschrieben hast, dass ich eine PHP Datei als Ressource einbinde. Nur binde ich nicht direkt diese Ressource ein, sondern rufe diese Ressource über die Methode auf.
Quasi so:
<img src="<?php $foobar->zeichne_diagramm(); ?>" />
zeichne_diagramm() ist dann in der Klasse so implementiert:
function zeichne_diagramm()
{
return 'ressource.php';
}
Auf der Seite selbst steht am Ende dann das gewünschte:
<img src="ressource.php" />
Ich werde es aber noch ein Stück weit dahin gehend abändern, dass ich gleich das ganze <img ...> von der Methode zurückgeben lasse, da ich sonst ein leeres <img src=""> da stehen hätte, wenn ressource.php nichts liefert.
Danke und Gruß,
Marcel
Hi!
Hallo
Da wird so nix!
<img src="<?php $foobar->zeichne_diagramm(); ?>" />
Doch
Ist das jetzt wieder Beweis durch Behauptung?
und mir kam gerade die Erleuchtung.
Oha!
Eigentlich ist es fast genau so, wie du geschrieben hast, dass ich eine PHP Datei als Ressource einbinde. Nur binde ich nicht direkt diese Ressource ein, sondern rufe diese Ressource über die Methode auf.
Nein - Du teilst via HTML-Attribut einen _Bezeichner_ für diese Ressource mit, welche dann via HTTP vom User Agent geladen wird.
Auf der Seite selbst steht am Ende dann das gewünschte:
<img src="ressource.php" />
Ja, einverstanden, was soll Dein Zwischenschritt davor?
Ich werde es aber noch ein Stück weit dahin gehend abändern, dass ich gleich das ganze <img ...> von der Methode zurückgeben lasse, da ich sonst ein leeres <img src=""> da stehen hätte, wenn ressource.php nichts liefert.
Das img- Element und seine Attribute sind die eine Sache, die Ressource eine andere - Du stehst mit Deinem Vorhaben wieder am Anfang!
off:PP
Nabend,
Nur binde ich nicht direkt diese Ressource ein, sondern rufe diese Ressource über die Methode auf.
Nein - Du teilst via HTML-Attribut einen _Bezeichner_ für diese Ressource mit, welche dann via HTTP vom User Agent geladen wird.
Ja, da habe ich offensichtlich falsche Begriffe verwendet. Ich arbeite daran.
Ja, einverstanden, was soll Dein Zwischenschritt davor?
Der ursprüngliche Wunsch war ja, dass durch diesen Aufruf direkt das Bild kommt und nicht erst ein zweiter Request abgesetzt werden muss. Meine Annahme war eben, dass zunächst via PHP das Bild erzeugt und dieses anschließend dann mit dem restlichen Code an den Browser sendet. Nur den Pfad zu einer statischen Ressource durchzureichen ist zugegeben ein wenig Banane.
In einem anderen Beitrag hierzu verweist Cheatah auf dies hier: http://aktuell.de.selfhtml.org/artikel/grafik/inline-images/index.htm. Da würde ich sagen, DAS ist genau das (Prinzip), wonach ich suche. Das Bild wird in einen Haufen von Buchstaben und Zahlen (ASCII Code) gewandelt. Prinzipiell ließe sich damit doch nun innerhalb der Methode zeichne_weißderkuckuckwas() ein Bild erzeugen, dieses anschließend umwandeln und der Haufen von ASCII-Zeichen als String zurückgeben? Dann hätte ich, was ich suche.
Die Fragen sind:
Ginge dies denn so überhaupt?
Würde dies von allen gängigen Browsern unterstützt?
Ließe sich dies einfach so auf jedem Server mit PHP-Unterstützung implementieren oder benötigte dies zusätzliche Bibliotheken (so wie die image Funktionen die GD-Bib. benötigen)?
Gruß,
Marcel
Nachtrag
Ginge dies denn so überhaupt?
Diese Frage streiche ich, denn die Antwort ist ja, wie ich eben festgestellt habe.
Mein Problem ist dabei allerdings noch, dass ich noch immer eine Datei benötige, um die Bilddaten einzulesen. Schreiben kann (darf) das ausführende Skript aber nicht auf dem Server. Dazu fehlen die notwendigen Rechte. :-(
Gruß,
Marcel
Nachtrag, die 2. (Editieren wäre jetzt gut, aber keine Ahnung ob und wie.)
Mein Problem ist dabei allerdings noch, dass ich noch immer eine Datei benötige, um die Bilddaten einzulesen.
Wie gut, dass es output buffering gibt. Des Rätsels finale Lösung rückt also nach einigem Suchen näher.
Hier ein Beispiel für Jene, die ein ähnliches Vorhaben vorhaben:
function zeige_farbiges_rechteck()
{
// Imagestream erzeugen
$im = imagecreatetruecolor( 400, 300 );
// Farbe festlegen
$col = imagecolorallocate( $im, 255, 255, 0 );
// Gefülltes Rechteck zeichnen
imagefilledrectangle( $im, 20, 20, 200, 200, $col );
// Ausgabe puffern
ob_start();
// Bild ausgeben (wird gepuffert)
imagepng( $im );
// Ausgabepuffer abfragen
$data = ob_get_contents();
// Ausgabepuffer leeren, Imagestream zerstören
ob_end_clean();
imagedestroy( $im );
// String kodieren und gleichmäßig aufteilen
$encoded = chunk_split( base64_encode( $data ));
// Kodierten String zurückgeben.
return $encoded;
}
Der Aufruf erfolgt dann z. B. über:
print '<img src="data:image/png;base64,'.$instanz->zeige_farbiges_rechteck().'" />';
Genau sowas hatte ich gesucht. Wunderbar. Danke Cheatah für den Link. Dieser hatte mich in die richtige Richtung geschubst.
Gruß,
Marcel
echo $begrüßung;
Genau sowas hatte ich gesucht. Wunderbar. Danke Cheatah für den Link. Dieser hatte mich in die richtige Richtung geschubst.
Du solltest ihn nur aufmerksamer lesen, denn da steht auch was zur (Nicht-)Verfügbarkeit dieser Methode.
echo "$verabschiedung $name";
Hallo dedlfix
Du solltest ihn nur aufmerksamer lesen, denn da steht auch was zur (Nicht-)Verfügbarkeit dieser Methode.
Ich lese nur etwas von:
Das funktioniert bei Netscape 4.x, aber leider nicht beim MS Internet Explorer 4.x - 5.x.
Es wird aber einen Hinweis in der Dokumentation geben, dass diese Funktionalität auf neuere Browserversionen baut. Welche genau unterstützt werden, werde ich in der kommenden Testphase ermitteln.
Meiner Meinung nach kann man für eine gewisse Abwärtskompatibilität sorgen, aber heutzutage ein Anwendung zu schreiben, die auch Browser aus Großmutters Zeiten unterstützt ist einfach übertrieben. Ein Sprichwort sagt: "Wer nicht mit der Zeit geht, muss mit der Zeit gehen."
Bislang sind überprüft: Epiphany, FF 2.0, Konqueror. Weitere folgen wie erwähnt in der kommenden Testphase, nachdem das Bild komplett integriert ist.
Gruß,
Marcel
Hallo,
ich habe ein Exempel online gestellt und dieses auf browsershots.org mal getestet. Erschreckend ist, dass bis auf den MSIE bis einschließlich der Version 7.0(!) alle anderen Browser damit umgehen können. Der MSIE kann dies erst ab Version 8.0. Da hatte ich mehr erwartet...
Gruß,
Marcel
Hi,
Würde dies von allen gängigen Browsern unterstützt?
Gegenfragen: Ist IE gängig? Ist IE ein Browser?
cu,
Andreas
Hi Marcel,
Mein Dilemma ist, dass ich das Bild nicht zwischenspeichern kann (darf), ich es also von der Methode quasi direkt zurückbekommen muss.
Mal vorausgesetzt, dass ich Deine Frage richtig verstanden habe, hier ein hoffentlich hilfreiche Antwort:
Wenn Du ein Bild in eine HTML-Seite einbindet, dann kommt das IMMER aus einer anderen Datei. Das liegt daran, dass das http-Protokoll eben so ist, wie es ist: eine http-Anfrage an einen Server kriegt als Antwort gewisse Daten, und die haben einen Content-type, der ENTWEDER "text/html" ODER "image/jpeg" (oder...) ist.
Wenn Du ein Bild dynamisch erzeugen und nicht auf dem Server speichern willst, dann kannst Du das tun, es muss aber dennoch in einer eigenen Datei gemacht werden, weil der HTML-Inhalt und das Bild nicht als Antwort auf dieselbe http-Anfrage geschickt werden koennen. Das heisst, Deine Funktion zeichne_diagramm() wuerde nichts weiter tun als ein Bild-Tag der Art
<img src = "zeichne_bild.php">
hinschreiben, und die Datei zeichne_bild.php wuerde dann dynamisch ein Bild (und NUR dieses eine Bild) erzeugen und zurueckgeben (wobei es dann wohl ueberfluessig waere, eine Funktion "zeichne_diagramm" ueberhaupt einzufuehren).
Das heisst, zeichne_bild.php kriegt
header("Content-type: image/jpeg");
und danach die Ausgabe eines erzeugten Bildes in die Datei (etwa durch image_jpeg().
Ich hoffe, das war einigermassen verstaendlich.
Viele Gruesse,
der Bademeister
Hallo
Ich hoffe, das war einigermassen verstaendlich.
Jop.
Meine Überlegung war auch nur die Folgende:
Ich erzeuge in einer Methode einen String und den gebe ich an die aufrufende Stelle zurück, quasi wie z.B. MD5() intern einen String zusammenbaut und diesen an mich zurück gibt und ich damit machen kann, wozu ich lustig bin. Dazu muss der String ja auch nicht erst in eine Datei geschrieben werden um diesen am Ende wieder daraus zu lesen.
Genau so hatte ich gedacht dies mit einem Bild zu tun. Ich erzeuge ein Bild und dessen Inhalt (ob binär oder wie auch immer) gebe ich dann direkt an die aufrufende Stelle zurück (um dann dort aus den Daten das Bild zu erzeugen).
Ich habe es, wie ich in der anderen Antwort geschrieben habe, nun so gemacht, dass ich einfach den Pfad zur Ressource mittels der Methode durchreiche. Das ist zwar auch nicht das gelbe vom Ei, aber naja. Es funktioniert erstmal. Um die Schönheit kümmere ich mich später.
Danke und Gruß,
Marcel
Hi,
Dazu muss der String ja auch nicht erst in eine Datei geschrieben werden um diesen am Ende wieder daraus zu lesen.
was in der Praxis auch hinreichend oft schief geht, weil man vergisst, dass über HTTP mehr als einer auf Daten zugreifen kann.
Genau so hatte ich gedacht dies mit einem Bild zu tun. Ich erzeuge ein Bild und dessen Inhalt (ob binär oder wie auch immer) gebe ich dann direkt an die aufrufende Stelle zurück (um dann dort aus den Daten das Bild zu erzeugen).
Sicher. Allerdings erst einen Request später.
Cheatah
Hi,
Wenn Du ein Bild in eine HTML-Seite einbindet, dann kommt das IMMER aus einer anderen Datei.
nö.
Das liegt daran, dass das http-Protokoll eben so ist, wie es ist:
Jupp. Das data-Protokoll jedoch nicht.
Cheatah
nö.
Ja ja stimmt ja. Ich hab die goldene Regel missachtet: Du sollst nicht leichtfertig ins Forum schreiben. Ich werd mich bessern ;-)
Gruß,
der Bademeister