Dieter Raber: Bilder verkleienern GDLib < 2

Hallo,

Beim Einsatz von GD 2 hat man zum Verkleinern von Bildern imagecreatetruecolor() und imagecopyresampled() zur Verfuegung, was ja auch gute Ergebnisse bringt. Bei GD 1.x geht das , soweit ich weis nur mit imagecreate() und imagecopyresized(), die Resultate sind dann ziemlich schlecht. Weiss jemand einen Workaround, wie man mit vertretbarem Aufwand bei GD 1.x auf vernuenftige Ergebnisse kommt.

Vielen Dank schonmal

Dieter

  1. Moin!

    Beim Einsatz von GD 2 hat man zum Verkleinern von Bildern imagecreatetruecolor() und imagecopyresampled() zur Verfuegung, was ja auch gute Ergebnisse bringt. Bei GD 1.x geht das , soweit ich weis nur mit imagecreate() und imagecopyresized(), die Resultate sind dann ziemlich schlecht. Weiss jemand einen Workaround, wie man mit vertretbarem Aufwand bei GD 1.x auf vernuenftige Ergebnisse kommt.

    Um die mangelnde Truecolor-Unterstützung kommst du nicht herum, und für das fehlende imagecopyresampled gibts bei php.net Ersatzfunktionen, die das gewünschte wesentlich langsamer als PHP-Skript umsetzen. Es empfiehlt sich also, das auf diese mühevolle Weise gewonnene Arbeitsergebnis nicht jedes Mal wieder zu generieren, sondern in einen Cache zu speichern.

    - Sven Rautenberg

    1. Hallo Sven,

      Um die mangelnde Truecolor-Unterstützung kommst du nicht herum

      Truecolor vs. indexed Colors ist meiner Ansicht nach die Hauptursache fuer die schlechte Qualitaet, da hilft das Ersetzen von imagecopyresampled nicht sehr. Troztdem vielen Dank fuer Deine Antwort.

      Dieter

      1. Moin!

        Truecolor vs. indexed Colors ist meiner Ansicht nach die Hauptursache fuer die schlechte Qualitaet, da hilft das Ersetzen von imagecopyresampled nicht sehr. Troztdem vielen Dank fuer Deine Antwort.

        Natürlich hast du ein Problem mit Bildern, die wirklich 16 Millionen Farben einsetzen. Allerdings läßt sich der Farbauswahlprozeß doch erheblich optimieren, würde ich meinen. Die gdlib wählt nach meinem Eindruck nämlich einfach die ersten 256 Farben, die in dem Bild vorkommen, aus. Und das sind mit Pech die unwichtigsten Farben - und du kriegst tolle Falschfarbendarstellung.

        Hast du mal getestet, was passiert, wenn du das eingelesene JPG direkt wieder ausgibst? Sind dann die Farben extrascheiße, oder nur normalscheiße (wegen 256 Farben vs. Truecolor)? Dann würde vielleicht imagepalettecopy() helfen, wenn sie nur "normalscheiße" sind. Damit kriegst du die durch das JPEG-Laden ausgewählten 256 Farben 1:1 in das Zielbild übertragen. Und die werden dann dort zum kleinskalieren herangezogen, und nicht neu ausgedacht.

        Alternativ kannst du dir natürlich eine Skalierungsfunktion komplett selber schreiben bzw. eine aus dem Fundus an Funktionen ziehen, die in den Kommentaren von imagecopyresized() drinstehen. Wie gesagt: Die ungünstige Farbwahl ist mit Sicherheit Schuld, aber das ist ein gemeinsames Problem von imagecreate(), der Palette und imagecopyresized(), welches man auf jeden Fall nachbessern kann.

        - Sven Rautenberg