texte und bild to img

So, alles klappt soweit sehr gut.
1 Frage z.Z. noch an sempervivum zum Code in #26:
"data:image/jpeg;base64,' . base64_encode($imgBuff) . '"
Was erzeugt das für einen Dateinamen, wenn ich es als Download anbiete?

MONI
 
Gute Frage, da bin ich im Moment überfragt. Du möchtest es ja wahrscheinlich nicht mit Rechtsklick und "Speichern unter" speichern lassen sondern einen Button zum Herunterladen, nicht wahr?
 
Ich dachte zunächst, man könne das base64-Bild als href-Attribut angeben genau wie bei einem Bild als src:
Code:
<a href="<?php echo base64_encode($imgBuff); ?>" download="das-bild.jpg">Bild herunter laden</a>
aber das funktioniert nicht. Der Dialog zum Speichern kommt zwar aber beim Herunterladen kommt es zu einem Serverproblem weil offenbar das ganze Bild in der URL steckt und diese zu lang wird.
Edit: Außerdem würde es nicht funktionieren, wenn man den base64-String einfach in eine Datei schreibt, müsste dann schon im Binärformat sein.

Aber wenn Du das Bild in einer temporären Datei speicherst, sollte es keine Probleme geben.
 
Zuletzt bearbeitet:
PS: Geht doch ohne temporäre Datei: Als Bildquelle oder href-Attribut kann man jederzeit ein PHP-Skript angeben, das das Bild ausgibt. D. h. im PHP-Skript am Schluss dieses:
Code:
header('Content-type:image/jpg');
echo $imgBuff;
Und dann ein a-href-Tag zum Herunterladen:
Code:
<a href="das-skript.php" download="das-bild.jpg">
    Bild herunter laden
</a>
 
Ja genau, aber kein Rechtsklick, ich hatte einen a-tag eingebaut
PHP:
 echo '<a href="data:image/jpeg;base64,' . base64_encode($imgBuff) . '" download>DOWNLOAD</a>';
und wollte wissen was und wie dabei der Dateiname erzeugt wird.
Ich will am Ende einen eigenen Dateinamen vergeben.
MONI
 
@Sempervivum
In Anlehung an Deinen Code aus #26 habe ich statt eines zweiten Bildes mal einen grünen Font eingebaut. Funktioniert auch alles, nur leider schaffe ich es nicht den mit Text zu füllen und dem Text auch Eigenschaften wie Platzierung sowie Schriftart, Farbe und Größe zuzuweisen. Alle Versuche sind bisher gescheitert, so dass ich Dich besser mit Einzelheiten verschone und nur meine Zzeile hier anzeige die funktioniert.
PHP:
...
    $img->addImage($img1);
    $img->newImage($wimg, 300, "green");

    $img->resetIterator();
    $combined = $img->appendImages(true);

    $imgBuff = $combined->getimageblob();

    $img->clear();
...

Idee wie ich das am besten umsetzen kann?

MONI
 
Zuletzt bearbeitet:
Imagick ist auch für mich Neuland aber ich habe durch Googeln und Lesen in der Doku dieses gemacht:
Code:
// Erstes Bild vorbereiten wie in #26

// Das zweite Bild vorbereiten
// $im2 = new Imagick(realpath('images/2015-02-28_Gegensteine_05.jpg'));

// Leeres Imagick-Objekt erzeugen
$im2 = new Imagick();
// Darin ein Bild mit grünem Hintergrund erzeugen
$im2->newImage($wimg, 200, 'green');
/* Text zeichnen */
// Offenbar ist es problemlos möglich, das selbe Draw-Ojekt
// vom ersten Bild wieder zu verwenden.
// Wir ändern Schriftgröße und Farbe:
$draw->setFontSize(20);
$draw->setFillColor('red');
// Text auf das zweite Bild zeichnen:
$im2->annotateImage(
    $draw,
    $wimg / 2,
    45,
    0,
    'The quick brown fox jumps over the lazy dog'
);


// Beide Bilder dem Gesamtbild hinzu fügen
$im->addImage($im1);
$im->addImage($im2);
$im->resetIterator();
$combined = $im->appendImages(true);

// base64-Format vorbereiten
$imgBuff = $combined->getimageblob();
header('Content-type:image/jpg');
echo $imgBuff;
Das funktioniert bei mir so weit. Ich frage mich nur, ob es auch ähnlich wie in Javascript-Canvas geht: Ein einziges Bildobjekt verwenden und darauf das Foto und die Schriften zeichnen. Bin aber nicht weiter eingestiegen, das zu klären.
Außerdem wäre hier das PNG-Format besser geeignet weil man deutlich Artefakte durch die Komprimierung erkennt.
 
Zuletzt bearbeitet:
Zurück