Thorsten Steffen: Problem mit GD-Version prüfen

Hio,

schreibe gerade ein kleines Skript, welches ein Thumbnail erzeugen soll. Wobei wenn die Funktion imagecopyresampled zur Verfügung steht soll dieses, ansonsten imagecopyresized verwendet werden.

Ich habe die ganze Zeit in der php.ini, die php_gd2.dll geladen und hat soweit alles Funktioniert, nachdem ich nun auf php_gd.dll umgestellt habe hakelt es Fehlermeldungen.

Warning: imagecopyresampled(): requires GD 2.0 or later in ...

bloss das ganze kann ich nun nicht mehr nachvollziehen.

<schnipp>
if (function_exists("imagecopyresampled")) {
   $this->_gdMajorVersion = 2;
   $this->_resizeImageFunction = "imagecopyresampled"; }
else {
   $this->_gdMajorVersion = 1;
   $this->_resizeImageFunction = ($this->useResampleBicubic = "on") ? "$"."this->imageCopyResampleBicubic" : "imagecopyresampled"; }
</schnipp>

Ich prüfe hier, ob es eine Funktion imagecopyresampled überhaupt gibt. Dies scheint komischerweise der Fall zu sein. Dem bin ich nachgegangen und habe mit
var_dump(get_extension_funcs("gd"));
mit alle Funktionen von gd  anzeigen lassen und ... finde einen Eintrag imagecopyresampled. hmmm ??? finde ich etwas verwundetlich, ich benutze gd version 1.6.3
Wie kann ich nun prüfen ob die Funktion nun _wirklich_ zur Verfügung steht? Die Möglichkeit phpinfo(8) zu parsen und die Version zu extrahieren finde ich nicht so dolle (muss ja die Ausgabe über buffering verhindern und diesen Teil herausschneiden), strebe daher eine andere an.

gl & hf

Thorsten

  1. Moin!

    schreibe gerade ein kleines Skript, welches ein Thumbnail erzeugen soll. Wobei wenn die Funktion imagecopyresampled zur Verfügung steht soll dieses, ansonsten imagecopyresized verwendet werden.

    Wie ich den Release-Notes zu PHP 4.3.0 entnommen habe, ist dort als Verbesserung genannt, dass die GD-Funktionen jetzt wirklich nur noch existieren (und mit function_exists() geprüft werden können), wenn die gdlib die Funktion tatsächlich unterstützt. Daraus schließe ich, dass es vorher auf diese Weise eben nicht möglich war. :)

    Mit anderen Worten: Krieg' irgendwie PHP 4.3.0 auf den Server, oder lass den Automatismus sein. Deine Alternative wäre, den Benutzer des Skripts manuell entscheiden zu lassen, welche Funktion auf dem Server zur Verfügung steht. imagecopyresampled() benötigt jedenfalls ganz sicher die gdlib 2.x, mit gdlib 1.x wirst du nichts werden. Eventuell könntest du ja auch (frag mich aber nicht, wie) die Versionsnummer der gdlib abfragen.

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Hio,

      Wie ich den Release-Notes zu PHP 4.3.0 entnommen habe, ist dort als Verbesserung genannt, dass die GD-Funktionen jetzt wirklich nur noch existieren (und mit function_exists() geprüft werden können), wenn die gdlib die Funktion tatsächlich unterstützt. Daraus schließe ich, dass es vorher auf diese Weise eben nicht möglich war. :)

      Hab mir PHP 4.3 noch nicht wirklich angeschaut, aber diese "Neuerung" macht durchaus Sinn :). Konnte das nicht so wirklich nachvollziehen, welchen Sinn es macht eine Funktion als "existierend" zu deklarieren wenn sie garnicht zur Verfügung steht. Ich hab noch ein wenig nachgelesehen im PHP-Manuel. Es scheint so, als wurde diese Funktion zwar mit PHP 4.06 eingeführt, kann aber nur eingesetzt werden wenn GD >2 zur Verfügung steht.

      Mit anderen Worten: Krieg' irgendwie PHP 4.3.0 auf den Server, oder lass den Automatismus sein. Deine Alternative wäre, den Benutzer des Skripts manuell entscheiden zu lassen, welche Funktion auf dem Server zur Verfügung steht. imagecopyresampled() benötigt jedenfalls ganz sicher die gdlib 2.x, mit gdlib 1.x wirst du nichts werden. Eventuell könntest du ja auch (frag mich aber nicht, wie) die Versionsnummer der gdlib abfragen.

      Das mit PHP 4.3 dürfte schwer sein, ist nicht mein Server ;)
      PHP 4.3 stellt sicherlich gute Neuerungen zur Verfügung, wobei mein Anliegen ist Skripte zu schreiben welche unter möglichst allen PHP4-Versionen laufen.
      Den Automatismus sein lassen, hmm, die Idee ist zunächst mal nicht schlecht. Bisher fahre ich dort eine halb und halb Lösung, meine Klasse besitzt eine interne Funktion ImageCopyResampleBicubic (eine modifizierte Variabte aus von php.net), welche bessere Ergebnisse liefert als imageCopyResized, diese kann deaktiviert werden. Sollte das auch mit dem imagecopyresampled so tun. Wobei ich mir schwer vorstellen, wenn man die Qualitätsunterschiede betrachtet, warum man die alte Funktion benutzen sollte.
      Ich versuche aber immer einen anderen Ansatz von Automatismus zu fahren, d.h. es gibt ein Standardverhalten, welches man auf Wunsch ändern kann. So kann muss ich, wenn ich mich im "defaultbereich" bewege nicht viel Aufwand betreiben um ein Thumbnail zu erzeugen. Im Endeffekt reicht das Instanzieren der Klasse mit dem Dateinamen und der Aufruf von createThumbnail().

      Ich habe mir vorläufig damit geholfen, zu prüfen ob ich ein bild mit imageCreateTrueColor() erzeugen kann um herauszufinden ob GD>2 vorhanden ist.
      Wie gesagt alternativ würde man an die Infos über phpinfo() kommen, wobei diese Funktion schon Ausgabe erzeugt und ich kein fan davon bin, das eine Funktion "ungefragt" Ausgabe erzeugt. Sicherlich ein besserer Weg wäre es für Funktionen ala phpinfo(), das sie nur die Informationen zur Verfügung stellen und dem Benutzer die Ausgabe überlassen.

      gl & hf

      Thorsten