MIK: Qualität von Thumbnails mit ImageCopyResized + ImageJPEG

Hallo!

Ich hab da ein Problem mit dem Erzeugen von Vorschaubildern. Ich lade ein großes Bild im .jpg-Format hoch und lasse es verkleinern und dann abspeichern. Das Ergebnis wird aber oft qualitativ bescheiden, hat einen Blaustich (bzw. sieht es fast monochrom aus) oder ist auch ganz schwarz. Ausgangsbilder meiner Versuche sind immer (optisch) qualitativ hochwertige .jpg's.

Hier der Teil zur Vorschaubilderzeugung aus meinem Script:

$Balt = ImageCreateFromJPEG($bigPic);

$Bneu = ImageCreate($BBneu, $BHneu);
  ImageCopyResized($Bneu, $Balt, 0, 0, 0, 0, $BBneu, $BHneu, $bigsize[0], $bigsize[1]);

$Vorschau = "TH" . $bigPic;
  ImageJPEG($Bneu,$Vorschau,100);

In manchen Fällen ist die Qualität aber auch völlig in Ordnung.

Frage: Woran liegt das und was kann ich tun, damit die Qualität immer gut ist?

Schönen Sonntag,

MIK

  1. Moin!

    Frage: Woran liegt das und was kann ich tun, damit die Qualität immer gut ist?

    1. Erstelle ein TrueColor-Bild, keines mit nur 256 Farben.
    2. Nimm ImageCopyResampled().

    Und wenn das nicht geht, hast du die gdlib 2 nicht in PHP eingebunden, und mußt dich entweder damit abfinden, oder das versuchen zu ändern.

    - Sven Rautenberg

    --
    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    1. Hi Sven,

      1. Erstelle ein TrueColor-Bild, keines mit nur 256 Farben.

      Das habe ich.

      1. Nimm ImageCopyResampled().

      Habe ich ausprobiert.

      Und wenn das nicht geht, hast du die gdlib 2 nicht in PHP eingebunden, und mußt dich entweder damit abfinden, oder das versuchen zu ändern.

      Es geht nicht, aber wie schon geschrieben, geht es bei manchen Bildern ja, während die Qualität bei anderen einfach nur grausam ist - also kann es nicht an der PHP-Konfiguration liegen, oder?

      MIK

      1. Beispiel:

        Dieses Bild erscheint monochrom in verschieden hellen Gelb-Tönen, es sind auf dem Gesicht keine Strukturen mehr zu erkennen:

        <img src="http://www.salvadordali.de/gemaelde/pics/bild430b.jpg" border="0" alt="">

        Dieses Bild erscheint in guter Qualität, alle Farben bleiben erhalten, alle Strukturen sind zu erkennen:

        <img src="http://www.salvadordali.de/gemaelde/pics/bild406b.jpg" border="0" alt="">

        1. Hier gibt es jetzt auch die Thumbs zu sehen - bin mir gerade nicht im klaren, ob das Linken zu einer Geocities-Site eine Todsünde ist, deswegen bitte ich um Nachsicht und kurze Info, falls dem so sein sollte. ;)

          http://www.geocities.com/testgrund/self.html

      2. Moin!

        1. Erstelle ein TrueColor-Bild, keines mit nur 256 Farben.

        Das habe ich.

        Hast du nicht.

        Du benutzt ImageCreate(). Nicht ImageCreateTruecolor(). Also hat das Zielbild nur 256 Farben. Und die werden reichlich willkürlich aus den existierenden Farben zu verkleinernden Bildes herausgesucht - mutmaßlich sind es die ersten 256 unterschiedlichen Farben der ersten paar Pixel, die eingefügt werden.

        1. Nimm ImageCopyResampled().

        Habe ich ausprobiert.

        Ist trotzdem wichtig, das zu behalten. Nur hilft es bei 256 Farben natürlich auch nichts.

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
        1. Hi Sven!

          1. Erstelle ein TrueColor-Bild, keines mit nur 256 Farben.

          Das habe ich.

          Hast du nicht.

          Du benutzt ImageCreate(). Nicht ImageCreateTruecolor().

          Alles klar, ich dachte, Du sprichst von dem .jpg, das hochgeladen wird. :) Mit ImageCreateTruecolor() funktioniert alles wie gewünscht,

          tausend Dank von

          MIK

  2. Hi,

    Frage: Woran liegt das und was kann ich tun, damit die Qualität immer gut ist?

    das liegt daran, dass du mit ImageCreateFromJPEG() ein Truecolor-Bild erzeugst, mit ImageCreate() allerdings nur ein Paletten-Bild, dem nur 256 Farben aus dem Quell-Bild zur Verfügung stehen (aber welche Farben soll es nehmen? ;-)).

    Falls du die gdlib 2 hast, würde ich so vorgehen, wie Sven das beschrieben hat (also mit ImageCreateTrueColor() und ImageCopyResampled()), da dies bessere Ergebnisse erzielen sollte. Falls nicht, kannst du das Truecolor-Bild nach dem Erzeugen mittels ImageTrueColorToPalette() in ein Paletten-Bild umwandeln und erst dann mittels ImageCopyResized() in das Ziel-Bild kopieren.

    $Balt = ImageCreateFromJPEG($bigPic);

    Füg hier hinter mal die Zeile

    ImageTrueColorToPalette($Balt, true, 256);

    ein, dann sollte es klappen, da das Quell-Bild nun auch nur noch 256 Farben besitzt, die dann dem Ziel-Bild für die Palette zur Verfügung stehen.

    Gruß,
    Andreas.

    1. Hallo Andreas,

      da haben sich wohl Dein Posting und mein letztes in diesem Thread überschnitten. Aber danke Dir für die zusätzliche Information! Wie schon gesagt, funktioniert das mit ImageCreateTrueColor() wunderbar.

      Schönen Tag,

      MIK