Le rendu de l'image avec php un fichier de sortie avec la html <img> tag
J'ai une classe avec plusieurs fonctions qui peuvent rendre des images.
//render.php
class Render {
public function Render($some_arguments) {
...
header("Content-Type: image/png");
$im = @imagecreate(110, 20)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);
imagepng($im);
return "data:image/png;base64,".base64_encode($im);
}
}
Ensuite, j'ai mon fichier php qui contient le code html et où je serais à la sortie de l'image à l'intérieur d'un < img>
tag:
//index.php
include("render.php");
$render = new Render();
echo "<htlm><head></head><body>";
echo "<img src=\"".$render->Render(1)."\" />";
echo "</body></html>";
Quand je le lance index.php dans mon navigateur, j'ai juste un écran vide.
Ne puis-je pas utiliser un appel de fonction, comme une source de l'image? Je sais que je peux utiliser un fichier php comme source, comme < img src="render_image.php" />
, mais alors je ne peut pas envoyer d'arguments dans un orientée objet (je sais que je peux utiliser $_GET pour récupérer les arguments), mais je voudrais le faire avec une belle orientée objet code écrit.
Donc, est-il possible d'utiliser un appel de fonction en tant que source d'une balise html?
->Render()
fonction serait sortie de l'img de données, pas de retour. Le travail sur le premier plutôt que l'interface d'un objet.OriginalL'auteur Rox | 2012-01-21
Vous devez vous connecter pour publier un commentaire.
Vous aurez à diviser:
Render(...)
va écrire un fichier temporaire (avec une étude randomisée de nom), qui est accessible à partir du web pour un certain temps.Une nouvelle méthode
Output()
sera de retour le randomisés nom mentionné ci-dessus.Vous appelez
Render()
avant de sortir le HTML et insérer l'URL à l'aide deOutput()
.Comme alternative, vous pouvez utiliser un fichier ou une base de données pour l'échange de paramètres, essentiellement une méthode
Prepare(...)
? écrire les paramètres dans le fichier ou la base de données, etRender()
la lecture de celles et de placer le fichier à nouveau, etc.Encore une autre solution (sans l'écrire dans le système de fichiers): Vous pourriez mettre en œuvre comprennent les données de l'image à l'aide d'un
data:
uri, mais la taille de l'image sera limitée selon le navigateur utilisé et vous ne pouvez pas mettre en cache les données de cette façon (c'est à dire, vous devez envoyer tout le temps).En fonction de ce que vous essayez d'atteindre, vous pourriez avoir de la chance de l'incorporation d'une image SVG. Cela aurait l'immense avantage d'être sur place tout en utilisant moins de bande passante, étant évolutive, etc. Inconvénient, c'est uniquement pris en charge dans les navigateurs les plus récents (similaire à
data:
), mais il n'y a aucune restriction de taille.Edit: à l'Aide de la base64/embedded approche, il est un peu plus compliqué résultant dans quelque chose comme ça (pas testé, mais devrait fonctionner):
Dans ce cas, vous ne devriez pas remarquer un retard important.
ob_start()
des causes justes PHP attendre avec l'envoi de la sortie destdout
(jusqu'à la fin du script ou de l'un desob_end_*()
fonctions est utilisé). Il devrait être encore beaucoup plus effectice puis l'écriture sur le disque en premier. Derrière les coulisses, il est semblable à l'écriture d'une rivière, puis la lecture de nouveau le contenu. À moins que l'image est vraiment énorme, plus les visiteurs ne devraient pas causer aucune incidence notable. Mais d'un autre côté: Si ce serait la cause de ces problèmes, d'autres solutions serait de le faire ainsi. Comme je l'ai mentionné, il suffit de ne pas utiliser de trop grandes images.OriginalL'auteur Mario
Vous pouvez encoder en BASE64 l'image et utiliser les données de schéma d'url:
par exemple.
Donc, si vous incluez qu'au lieu de l'image raw vous pouvez faire exactement ce que vous voulez.
(Voir les exemples de Wikipediea)
Mise à jour de ma réponse à inclure une approche qui doit travailler avec des images dynamiques.
Oui. Donc, la façon de le faire est d'avoir la src=" paramètre de votre balise img point à un script php comme ceci <img src='render_image.le php?param1=val1' />, alors que le script php (render_image.php) sera en charge de votre fonction rendu comme il est, qui affiche les en-têtes et le corps de l'image générée. Qui va travailler sans l'écriture de toutes les données d'image sur le disque dur.
OriginalL'auteur hypercrypt
La cause la plus probable de l'écran vide a à faire avec deux ensembles de données d'en-tête sont soumises. Donc, tout d'abord, vous êtes l'exécution de cette instruction:
Qui sera automatiquement défini le type de contenu des données envoyées par le navigateur.
Ensuite, vous exécutez cette ligne:
Ce qui entraîne ligne à exécuter:
Cette tente ensuite de définir un en-tête différent de ce qui a déjà été envoyée par le premier écho de la déclaration.
Je recommande chaning le Render() de la fonction plutôt accepter un nom de fichier, puis écrire l'image de ce fichier et retourne le chemin pointant vers le fichier de l'image qui a été écrit. De cette façon, vous n'êtes pas en essayant de sortie d'un fichier image et un fichier html dans le même flux de données vers le navigateur.
Ce qui concerne,
Ralfe
OriginalL'auteur ralfe
J'ai eu à peu près le même problème il y a longtemps. Vous pouvez trouver une solution et certains problèmes possibles ici: Inline images générées dépassant en longueur
La base je pense que vous cherchez est
<img src="data:image/png;base64,[data in base64]"/>
OriginalL'auteur nijansen