Erzeugte Grafik mit base64 codieren statt ausgeben

visiondpc

Erfahrenes Mitglied
Hallo, ich habe mal eine kurze Frage zur Ausgabe einer mittels PHP erzeugten Grafik. Besteht die Möglichkeit den Quelltext der erzeugten Grafik von irgendeiner Funktion als Rückgabewert zu erhalten?

Der Grundgedanke ist, dass ich innerhalb eine Formulares ein Captcha als Absendebutton verwende. Anstatt dieses Captcha nun in einer 2. Datei zu generieren die ich mittels input-img-Tag einbinde soll es base64-codiert (<img src="data:image/png;base64,iVB...) direkt im gleichen Dokument generieren und eingebunden werden. Leider finde ich in der PHP-Doku keine Funktion die mir dies ermöglicht.
Die einzige Idee die ich hatte wäre das Bild in einer temporären Datei zu speichern und dann auszulesen. Das ist aber natürlich nicht wirklich der Sinn der Sache.

Kann mir da jemand auf die Sprünge helfen? Danke schon mal im Voraus.
 
Hab mal ein kleines Testscript geschrieben, das dir da Tips geben könnte

PHP:
<?php 
/**
 * Test-Funktion
 * Retour-Wert ist ein erstelltes Image
 */
function createImageSource(){
    $image = imagecreate(100, 100);
    $white = imageColor($image, '#000000');
    $black = imageColor($image, '#FFFFFF');
    imagefill($image, 0, 0, $black);
    imageline($image, 0, 0, 100, 100, $white);
    $retVal = imagepng($image);
    imagedestroy($image);   
    return $retVal;
}

/**
 * Aufruf des Testes
 */
echo createImageSource();

/**
* create a imageColor by a html #-Value (#FFFFFF, #00FFFF etc.)
* @param    Image
* @param    String color als Hexwert
* @return   ImageColor
*/
function imageColor(&$image, $color){
    define('HEX_COLOR_PATTERN', '/^#([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})$/');
    //hexwert parsen
    preg_match(HEX_COLOR_PATTERN, $color, $rgb);
    //Gefundener Gesammtstring entfernen 
    array_shift($rgb);
    //Hexwerte in Decimale Werte wandeln und array um eine Stufe reduzieren
    array_walk($rgb, create_function('&$item, $key', '$item = hexdec($item);'));
    return ImageColorAllocate($image, $rgb[0], $rgb[1], $rgb[2]);
}

?>
 
Danke, aber im Grunde tut das Skript nichts anderes als die Grafik ohne Header auszugeben. Ich sehe da grad keine Möglichkeit, das an eine Variable oder Funktion zu übergeben. Man könnte höchstens die Ausgabe an der Stelle buffern aber da muss es doch auch einfachere Lösungen geben.
 
anstelle des echos kannst du es in eine Variable schreiben. Die Funktion ist auch nur ein Test der eine diagonale Linie zeichnet.
Den String kannst du ein eine DB Speichern, in eine Session-Variable speichern oder was auch immer.
Ich hab dich so verstanden, dass es das ist was du willst.
 
imagepng

bool imagepng ( resource $image [, string $filename [, int $quality [, int $filters ]]] )

Rückgabewerte
Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Hast Du Deine Funktion mal ohne echo aufgerufen? Dann wird das gleiche ausgegeben. Die Ausgabe wird nicht durch das echo erzeugt, sondern durch die Funktion imagepng und die gibt true/false und keinen String zurück.
 
Zuletzt bearbeitet:
Dann kannst du es mit einem Ausgabepuffer versuchen

PHP:
....
ob_start();    
imagepng($image);
$string = ob_get_clean();
ob_end_clean;

var_dump($string);
...
 
Diese Idee hatte ich wie oben geschrieben ja auch schon. Das Problem dabei ist, es ist zum einen keine wirklich saubere Lösung, zum anderen arbeitet die Debug-Klasse ebenfalls mit dem Ausgabepuffer was bedeuten würde, dass wenn der Debugger aktiv ist sich die beiden Funktionen ins Gehege kommen.
 
Zurück