Spoonman: PHP Bild erstellen und Download-Dialog öffnen

Hallo zusammen!

Ich schreibe in einem Script Text in ein JPEG-Bild.

<?php

$text = wordwrap($_GET["text"],47);
$font = 'font.ttf';
$picture = 'mein_bild.jpg';
$im = imagecreatefromjpeg($picture);
$white = ImageColorAllocate ($im, 255, 255, 255);
imagettftext($im, 8, 0, 100, 35, $white, $font, $text);

header("Content-Type:image/jpeg");
Imagejpeg ($im, "", 100);
ImageDestroy ($im);
?>

Diese Ausgabe funktioniert auch einwandfrei. Mein Problem ist aber, dass das Bild zwingend mit 300dpi heruntergeladen werden muss. Im Browser werden sie aber immer auf 72dpi heruntergerechnet. Deshalb stimmt beim Herunterladen die Grösse nicht.

Um dieses Problem zu lösen, möchte ich die Datei nicht im Browser ausgeben, sondern dem User direkt über einen Download-Dialog zum herunterladen anbieten.

Meine Fragen:

  • Ist es möglich, dass das Bild schon beim imagecreatefromjpeg() auf 72dpi heruntergerechnet wird? Liegt es wirklich nur am Browser? Kann ich das Problem mit dem Download-Dialog umgehen?
  • Wie kann ich die Datei per header('Content-Disposition: attachment; filename="bild.jpg"'); einbinden? Welche Angaben mache ich bei "bild.jpg" hin? Wäre dies $im?

Vielen Dank für eure Hilfe.

Gruss
Spoonman

  1. Moin!

    Diese Ausgabe funktioniert auch einwandfrei. Mein Problem ist aber, dass das Bild zwingend mit 300dpi heruntergeladen werden muss. Im Browser werden sie aber immer auf 72dpi heruntergerechnet. Deshalb stimmt beim Herunterladen die Grösse nicht.

    Nein, das ist falsch. Ein JPEG-Bild hat nur Pixel.

    Wie groß so ein Pixel ausgedruckt wird, ist nicht Sache des JPEG-Bildes. Ich glaube sogar, dass im JPEG-Format gar kein Datenfeld für die vom Hersteller gewünschte (aber bequem ignorierbare) Druckgröße enthalten ist.

    Wenn du dein Bild gerne in 300 DPI ausgedruckt haben willst, kannst du problemlos eine HTML-Seite erzeugen, die ein Druckstylesheet enthält, welches deinem Bild eine Höhe und Breite in Zentimetern, Millimetern oder Inch zuweist. Der Browser wird das Bild dann passens skalieren (und dabei eventell Pixel wegrechnen, bevor er das Bild zum Drucker schickt - leider sind Browser nicht für die Druckvorstufe geeignet).

    Alternativ gibst du dein Bild einfach aus und überläßt es dem Bildempfänger, es in 300 dpi auszudrucken. Indem du das Bild durch passende HTTP-Header als Download ausgibst, wird das natürlich erleichtert. "application/x-msdownload" wäre ein guter Mimetyp für dieses Vorhaben.

    Meine Fragen:

    • Ist es möglich, dass das Bild schon beim imagecreatefromjpeg() auf 72dpi heruntergerechnet wird? Liegt es wirklich nur am Browser? Kann ich das Problem mit dem Download-Dialog umgehen?

    Nein. Die Bildfunktionen von PHP behandeln nur Pixel, nicht ihre physikalische Ausdehnung beim Drucken. Der Browser ist nicht Schuld, ein Download ändert nichts.

    • Wie kann ich die Datei per header('Content-Disposition: attachment; filename="bild.jpg"'); einbinden? Welche Angaben mache ich bei "bild.jpg" hin? Wäre dies $im?

    Content-Type wäre hilfreicher, das Content-Disposition erlaubt nur die Angabe eines Namensvorschlags für den Download.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."