Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Bildqualität Thumbnails

    kaisa

    • Schreiberling
    • Beiträge: 366
    Bildqualität Thumbnails
    am: 18. April 2017, 22:35:01
    Ich bin ratlos.

    Obwohl ich ein "alter Hase" bin und schon lange den Shop nutze ist mir aufgefallen, dass die Artikel-Infobilder ziemlich schlecht sind. Ich weiß ziemlich gut, wie gut die JPG-Qualitäten aussehen müssten und habe im Shop von 5-100 alles durchprobiert und sehe Änderungen.

    Mache ich das selbe in Bildbearbeitungsprogrammen (alter Hase!) habe ich deutlich bessere Ergebnisse.

    Jedes Mal lade ich ein Produktbild neu hoch, denn ich will nicht hunderte Produktbilder beim Testen neu berechnen.

    Ich hatte GD2 genutzt, aber zum Testen mal GD2_advanced einstellt, bin aber dennoch ratlos. Die großen Pop-up-Bilder sehen einwandfrei aus.

    Als Notbehelf habe ich mal Schärfen von kleinen Produktbildern (<400pix Breite) eingestellt, was schon deutlich etwas bringt. Vielleicht als Anregung für Shop 1.06

    admin/includes/classes/image_manipulator_GD2_advanced.php
    Zeile 68:
    Code: PHP  [Auswählen]
            // Any other images
            default:
              $dest = imageCreateTrueColor($d_w, $d_h);
            // Sharpen small images
            // return imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
            if ($d_w <400) {
                $sharpenMatrix = array
                (
                    array(-1.2, -1, -1.2),
                    array(-1, 20, -1),
                    array(-1.2, -1, -1.2)
                );

                // calculate the sharpen divisor
                $divisor = array_sum(array_map('array_sum', $sharpenMatrix));

                $offset = 0;

                // apply the matrix
                imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
                return imageconvolution($dest, $sharpenMatrix, $divisor, $offset);
            }
            else
                return imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
          }
            // End of sharpening


    Linkback: https://www.modified-shop.org/forum/index.php?topic=37084.0

    swolfram [templatix]

    • Fördermitglied
    • Beiträge: 1.174
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #1 am: 19. April 2017, 09:13:45
    1) Danke
    2) Anregungen für Shop 1.06 braucht wohl keiner mehr ;-)
    3) Du bearbeitest JPG nach. Was ist mit den anderen Bildern?

    Ich habe das jetzt nicht getestet, aber kann auch nicht sagen das Bilder schlecht aussehen. Wenn die Bilder in der Größe erzeugt werden, die das Template auch ohne Nachkorrektur anzeigt, passt doch alles.

    Hast Du evtl. Beispielbilder? Standard vs. Deine Version?

    Tipp:
    Für die Einsteiger hier wäre es schön, wenn Du einfach die komplette, überarbeitete Datei anbietest.

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #2 am: 19. April 2017, 09:33:44
    Ich finde, dass das imageprocessing eines der wichtigsten Punkte für zukünftige Updates ist.

    1) wegen der von dir angesprochenen Qualität und

    2) wegen der Größe der Bilder.

    Die Vorschaubilder sind viel zu groß und google hängt sich daran immer auf und vergibt bei pagespeed insights teilweise 40Punkte weniger. Der Umweg, die Bilder selbst zu speichern und durch jpegmini pro und dann durch imageoptim zu jagen ist einfach umständlich. Bei Erstinstallation durch einen Admin kein Problem, aber für jeden neuen Artikel umständlich. Und vor allem für viele, die dann den shop nutzen sicherlich nicht umsetzbar. Und dann gehts wieder los, dass google das bemängelt. Auch wenn der speedpage index nur kleine Gewichtung für das Ranking bedeuted, hat das ja auch was mit positiven Nutzererlebnis zu tun, wenn die Seite schneller lädt. Nicht umsonst sind die Bilder laut der Bildnamen im Demoshop auch extra für google bearbeitet worden.

    manne35

    • Fördermitglied
    • Beiträge: 591
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #3 am: 19. April 2017, 10:07:50
    ImageMagick. Davon lese ich viel gutes. Vielleicht gibts da weniger Qualitätsverluste beim verkleinern.

    @kaisa.  Danke für den Tipp. Das werde ich auch mal testen.

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #4 am: 19. April 2017, 12:15:25
    Gibt dazu auch ein Ticket #612.

    Also gute Vorschläge auch da hinterlegen, damit es vielleicht wirklich wie angestrebt in 2.1 verbessert wird.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #5 am: 19. April 2017, 16:51:46
    ...
    Die Vorschaubilder sind viel zu groß und google hängt sich daran immer auf und vergibt bei pagespeed insights teilweise 40Punkte weniger.
    ...

    Das liegt doch eher an deinem Template und den dazu gehörigen Einstellungen für die Thumbnail-Bilder im Backend (oder, wenn du die Info-Images auf der Produkt-Einzelseite meinst eben an den Info-Bildern).
    Ansonsten gebe ich dir Recht, die Bildqualität könnte besser sein.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #6 am: 19. April 2017, 17:34:02
    @noriddle

    Bemängelt werden nur die thumbnail_images.
    Benutze das tpl_modified_responsive template, wie im demoshop und die Einstellungen und Pixe- Größe der Bilder ist auch wie im Demoshop.

    Trotzdem sind die Bilder zu groß. Erst wenn ich sie nochmal runterziehe nach dem imageprocessong und dann die zwei Programme nutze und sind dann wieder hochlade, wird die Größe nicht mehr bemängelt.

    Die original Images hab ich natürlich vorher auch schon durch die zwei Programme geschickt.

    Im Ticket #612 steht ja auch, dass die Bilder teilweise sogar größer werden.

    Der demoshop kommt auf die hohen Werte in speedpage auch nur durch Bilder, die nicht durch das originale imageprocessing erstellt wurden. Sieht man an der Qualität und am Namen. Ob die durch bestimmte Programme erstellt wurden und dann hochgeladen wurden, oder ob das Team das imageprocessing speziell angepasst hat, weiß ich natürlich nicht.

    Hatte dazu aber Torsten mal angefragt und er meinte es wäre machbar, aber zeitaufwendig. Hatte das aus Kostengründen erstmal hinten angestellt.

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #7 am: 19. April 2017, 18:07:13
    https://dev.modified-shop.org/images/product_images/thumbnail_images/32_0.jpg.pagespeed.ce._hrqrJZhvj.jpg

    https://dev.modified-shop.org/images/product_images/info_images/1_0.jpg.pagespeed.ce.0QLJaeJna2.jpg

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #8 am: 22. April 2017, 18:34:51
    Ich glaube ich bin dir nicht richtig gefolgt.
    Du meintest ja nicht die Größe im Sinne der Darstellung (also in Pixel) sondern die Dateigröße (also KiloByte).
    Dafür unterstütze ich nochmal ausdrücklich das Ziel den Imageprozessor soetwas berücksichtigen zu lassen, insofern möglich, da habe ich leider wenig Plan von.
    Jedenfalls dürfte die einfache PHP-Funktion imagejpeg() nicht ausreichend sein, auch wenn man da die Quality einstellen kann (im Backend konfigurierbar), da je nach Ausgangsqualität der Bilder unter 75 alles bescheiden aussieht.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #9 am: 22. April 2017, 22:26:22
    @noriddle

    Ja, war vielleicht nicht ausreichend beschrieben von mir. Mir gehts tatsächlich um die kilobytegröße.

    Klar kann man sich mit anderen Programmen behelfen, wenn man weiß wie. Aber das ist für viele zu umständlich, oder nicht machbar-weil entweder keine Ahnung, oder keine richtigen Programme. Und es gibt ja auch Leute, die das Imageprocessing nutzen, weil sie ein copyright wasserzeichen haben wollen und selbst nicht wüssten, wie sie es so in das Bild bekommen. So werden die Bilder dann aber immer schlechter in der Qualität. Und deshalb jedesmal seinen Dienstleister des Vertrauens anzurufen, ist wohl dann doch so kostenintensiv, dass schlechtere Bilder das kleinere Übel sind.

    Wie sieht es denn bei anderen Shopsystemen aus? Ist das Imageprocessing da besser?

    Grüße

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #10 am: 22. April 2017, 22:57:07
    Hallo

    Ich habe einen Imageprocessing-Test mit einem JPEG-Bild und dem Shop-Skript 'image_manipulator_GD2_advanced.php' gemacht und folgendes Ergebnis erhalten.

    Mit der Einstellung "Bildqualität 80%" erhalte ich dieses Bild

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Mit der Einstellung "Bildqualität 100%" erhalte ich dieses Bild

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Optisch kann ich keinen Unterschied bezüglich Bildqualität erkennen, erst beim Vergrössern des Bildes mit dem Browser wird ein Unterschied sichtbar. Worin sich aber die Bilder sofort erkennbar unterscheiden ist die Dateigrösse, beim generieren des Bildes mit einer Bildqualität von 80% hat das Bild nur eine Datenvolumen von 4.403 Bytes während es mit einer Bildqualität von 100% generiert die sagenhafte Dateigrösse von 12.365 Bytes erhält.

    Mein Fazit:
    Bilder im JPEG-Format sollte man fürs Web mit maximal einer Bildqualität von 80% erstellen.

    PS:
    Für diejenigen die die Bildqualität in Bezug zur Dateigrösse selbst prüfen möchten, habe ich ganz unten die Bilder noch in ein ZIP gepackt.

    Gruss
    Hanspeter

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Re: Bildqualität Thumbnails
    Antwort #11 am: 22. April 2017, 23:33:05
    @hpzeller

    Danke. Krasser Größenunterschied. Ich hab das immer auf 100% gelassen, weil das Ergebnis schon schlecht war und ich dachte es wird noch schlechter. Dann kann man sich das mit anderen Programmen vielleicht sparen, wenn man eh das Imageprocessing nutzt wegen des Wasserzeichens. Ändert aber nichts daran, dass die Qualität bei gleicher Größe wesentlich besser ist, wenn man es mit anderen Programmen macht. Insofern muss das Imageprocessing verbessert werden.

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.850
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #12 am: 23. April 2017, 06:31:00
    Kommt aber immer auch auf die Farben und die Form drauf an. Schräg verlaufende Linien machen schneller Probleme. Ebenso werden gerade Farben wie rot schneller unscharf/pixelig als zum Beispiel schwarz.

    Leider gibt es meines Erachtens keine allgemeingültige Einstellung, die immer gute Bilder erstellt, dabei aber die perfekte Minimalgröße hat.

    Je weniger Farben und je simpler die Form des Gegenstandes umso geringer kann man die Qualität setzen. Ich habe auch schon Produkte eingestellt, da hat man z. B. In Photoshop auch bei nur 40% keinen Unterschied erkennen können. Farbflächen fangen aber da extrem zum "clouden" an...

    Und gerade in Bezug auf Größe ist das integrierte Imageprocessing nicht das Gelbe vom Ei...bessere und kleinere Bilder erhält man, sofern man alle manuell erstellt. Das kann aber sicher nicht jeder leisten.

    karsta.de

    • Experte
    • Beiträge: 3.056
    Re: Bildqualität Thumbnails
    Antwort #13 am: 23. April 2017, 09:01:50
    Habe jetzt auch mal die Scripterweiterung von kaisa getestet und bin überrascht. Die Bildqualität des Thumbnails ist wirklich viel besser.
    (Allerdings fehlt in dem Script eine geschweifte Klammer hinter dem else, { gesetzt, dann funktionierts.)

    Habe das selbe Bild zweimal hochgeladen. Erstes Bild mit dem unveränderten Script und das untere Bild mit dem veränderten Script zur Ansicht. (Da meine info-Bilder auch nicht größer als 400px sind, wurde so auch gleich die Ansicht dieser Bilder verbessert.)

    hpzeller

    • Experte
    • Beiträge: 4.130
    • Geschlecht:
    Re: Bildqualität Thumbnails
    Antwort #14 am: 23. April 2017, 10:27:05
    Ja der Qualitätsunterschied ist frappant.

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Hier der komplette Code der 'admin/includes/classes/image_manipulator_GD2_advanced.php' mit eingebauter und korrigierter Codeerweiterung von kaisa.
    Code: PHP  [Auswählen]
    <?php
      /* ----------------------------------------------------------------------------------------
       $Id: image_manipulator_GD2.php 3072 2012-06-18 15:01:13Z hhacker $

       modified eCommerce Shopsoftware
       http://www.modified-shop.org

       Copyright (c) 2009 - 2013 [www.modified-shop.org]
       -----------------------------------------------------------------------------------------
       based on:
       (c) 2006 XT-Commerce (image_manipulator_GD2.php 950 2005-05-14)
       (C) 2006 Noxware, B. W. Masanek - Support for transparency, enhanced PNG & GIF processing

       Third Party contributions:
       class thumbnail - proportional thumbnails with manipulations by mark@teckis.com
       You find more great scripts and some information at www.teckis.com

       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/

      defined('_VALID_XTC') or die('Direct Access to this location is not allowed.');
      class image_manipulation {
        var $effects_disabled = false; //DokuMan - 2011-01-06
        function __construct($resource_file, $max_width, $max_height, $destination_file="", $compression=IMAGE_QUALITY, $transform="") {
          $this->a = $this->correctImageOrientation($resource_file);  // image to be thumbnailed
          $this->c = $transform;
          $this->d = $destination_file;  // thumbnail saved to
          $this->e = $compression;  // compression ration for jpeg thumbnails
          $this->m = $max_width;
          $this->n = $max_height;
          $this->compile();
          if($this->c !== "") {
            $this->manipulate();
            $this->create();
          }
        }

        //BOF - DokuMan - 2011-01-06 - added imagecopyresampled_adv - support for transparent PNGs
        // Support for transparency, enhanced PNG & GIF processing
        function imagecopyresampled_adv($image_type, &$dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h) {
          switch ($image_type) {
            // Process GIF images
            case 1:
              $transcol = imagecolortransparent($source);
              $dest = imagecreate($d_w, $d_h);
              imagepalettecopy($dest, $source);
              if ($transcol != '-1') {
                imagefill($dest, 0, 0, $transcol);
              }
              imagecolortransparent($dest, $transcol);
              return imagecopyresized($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
              break;

            // Process PNG images
            case 3:
              $dest = imageCreateTrueColor($d_w, $d_h);
              imagealphablending($dest, false);
              imagesavealpha($dest, true);
              $transparent = imagecolorallocatealpha($dest, 255, 255, 255, 0);
              //BOF - DokuMan - 2011-01-06 - imagecolortransparent much faster on big images
              //for ($x = 0; $x < $d_w; $x++) {
              //  for ($y = 0; $y < $d_h; $y++) {
              //    imageSetPixel($dest, $x, $y, $transparent);
              //  }
              //}
              imagecolortransparent($dest,$transparent);
              //EOF - DokuMan - 2011-01-06 - imagecolortransparent much faster on big images
              return imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
              break;
                             
            // Any other images
            default:
              $dest = imageCreateTrueColor($d_w, $d_h);
            // Sharpen small images
            // return imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
            if ($d_w <400) {
                $sharpenMatrix = array
                (
                    array(-1.2, -1, -1.2),
                    array(-1, 20, -1),
                    array(-1.2, -1, -1.2)
                );

                // calculate the sharpen divisor
                $divisor = array_sum(array_map('array_sum', $sharpenMatrix));

                $offset = 0;

                // apply the matrix
                imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
                return imageconvolution($dest, $sharpenMatrix, $divisor, $offset);
            } else {
                return imagecopyresampled($dest, $source, $d_x, $d_y, $s_x, $s_y, $d_w, $d_h, $s_w, $s_h);
            }
            // End of sharpening                    
          }
        }
        //EOF - DokuMan - 2011-01-06 - added imagecopyresampled_adv - support for transparent PNGs

        function compile() {
          $this->h = getimagesize($this->a);
          if(is_array($this->h)){
            $this->i = $this->h[0];
            $this->j = $this->h[1];
            $this->k = $this->h[2];
           
            //BOF -web28- 2011-03-27 - OPTION DO NOT ENLARGE SMALL PICTURES
            if(PRODUCT_IMAGE_NO_ENLARGE_UNDER_DEFAULT == 'false'){
              if($this->i < $this->m) {$this->m = $this->i;}
              if($this->j < $this->n) {$this->n = $this->j;}
            }
            //EOF  -web28- 2011-03-27 - OPTION DO NOT ENLARGE SMALL PICTURES
           
            if($this->m == '0'){
              $this->z = ($this->j / $this->n);
              $this->m = ($this->i / $this->z);
            }
            $this->o = ($this->i / $this->m);
            $this->p = ($this->j / $this->n);
            $this->q = ($this->o > $this->p) ? $this->m : round($this->i / $this->p); // width
            $this->r = ($this->o > $this->p) ? round($this->j / $this->o) : $this->n; // height
          }
          $this->s = ($this->k < 4) ? ($this->k < 3) ? ($this->k < 2) ? ($this->k < 1) ? Null : imagecreatefromgif($this->a) : imagecreatefromjpeg($this->a) : imagecreatefrompng($this->a) : Null;
          if($this->s !== Null) {
            //BOF - DokuMan - 2011-01-06 - use new imagecopyresampled_adv here
            // Creates an new image: $this->t. $this->k is the image type.
            $this->u = $this->imagecopyresampled_adv($this->k, $this->t, $this->s, 0, 0, 0, 0, $this->q, $this->r, $this->i, $this->j);
            //EOF - DokuMan - 2011-01-06 - use new imagecopyresampled_adv here
          }
        }

        function hex2rgb($hex_value) {
          $this->decval = hexdec($hex_value);
          return $this->decval;
        }

        function bevel($edge_width=10, $light_colour="FFFFFF", $dark_colour="000000") {
          // Not working properly for PNG images, so skipping
          if ($this->effects_disabled || $this->k == 3)
            return; //DokuMan - 2011-01-06
          $this->edge = $edge_width;
          $this->dc = $dark_colour;
          $this->lc = $light_colour;
          $this->dr = $this->hex2rgb(substr($this->dc,0,2));
          $this->dg = $this->hex2rgb(substr($this->dc,2,2));
          $this->db = $this->hex2rgb(substr($this->dc,4,2));
          $this->lr = $this->hex2rgb(substr($this->lc,0,2));
          $this->lg = $this->hex2rgb(substr($this->lc,2,2));
          $this->lb = $this->hex2rgb(substr($this->lc,4,2));
          $this->dark = @imagecreate($this->q,$this->r);
          $this->nadir = @imagecolorallocate($this->dark,$this->dr,$this->dg,$this->db);
          $this->light = @imagecreate($this->q,$this->r);
          $this->zenith = @imagecolorallocate($this->light,$this->lr,$this->lg,$this->lb);
          for($this->pixel = 0; $this->pixel < $this->edge; $this->pixel++) {
            $this->opac =  100 - (($this->pixel+1) * (100 / $this->edge));
            @ImageCopyMerge($this->t,$this->light,$this->pixel,$this->pixel,0,0,1,$this->r-(2*$this->pixel),$this->opac);
            @ImageCopyMerge($this->t,$this->light,$this->pixel-1,$this->pixel-1,0,0,$this->q-(2*$this->pixel),1,$this->opac);
            @ImageCopyMerge($this->t,$this->dark,$this->q-($this->pixel+1),$this->pixel,0,0,1,$this->r-(2*$this->pixel),max(0,$this->opac-10));
            @ImageCopyMerge($this->t,$this->dark,$this->pixel,$this->r-($this->pixel+1),0,0,$this->q-(2*$this->pixel),1,max(0,$this->opac-10));
          }
          @ImageDestroy($this->dark);
          @ImageDestroy($this->light);
        }
        function greyscale($rv=38, $gv=36, $bv=26) {
          //BOF - DokuMan - 2011-01-06
          // Not working properly for PNG & GIF images, so skipping
          if ($this->effects_disabled || $this->k == 3 || $this->k == 1)
            return;
          $this->bgc = $bg_colour;
          $this->br = $this->hex2rgb(substr($this->bgc, 0, 2));
          $this->bg = $this->hex2rgb(substr($this->bgc, 2, 2));
          $this->bb = $this->hex2rgb(substr($this->bgc, 4, 2));
          $this->dot = @ImageCreate(6, 6);
          $this->dot_base = @ImageColorAllocate($this->dot, $this->br, $this->bg, $this->bb);
          $this->zenitha = @ImageColorClosest($this->t, $this->br, $this->bg, $this->bb);
          for ($this->rad = 0; $this->rad<6.3; $this->rad+=0.005) {
            $this->xpos = floor(($this->q) + (sin($this->rad) * ($this->q))) / 2;
            $this->ypos = floor(($this->r) + (cos($this->rad) * ($this->r))) / 2;
            $this->xto = 0;
            if ($this->xpos >= ($this->q/2)) {
              $this->xto = $this->q;
            }
            @ImageCopyMerge($this->t, $this->dot, $this->xpos - 3, $this->ypos - 3, 0, 0, 6, 6, 30);
            @ImageCopyMerge($this->t, $this->dot, $this->xpos - 2, $this->ypos - 2, 0, 0, 4, 4, 30);
            @ImageCopyMerge($this->t, $this->dot, $this->xpos - 1, $this->ypos - 1, 0, 0, 2, 2, 30);
            //EOF - DokuMan - 2011-01-06
            $this->rv = $rv;
            $this->gv = $gv;
            $this->bv = $bv;
            $this->rt = $this->rv+$this->bv+$this->gv;
            $this->rr = ($this->rv == 0) ? 0 : 1/($this->rt/$this->rv);
            $this->br = ($this->bv == 0) ? 0 : 1/($this->rt/$this->bv);
            $this->gr = ($this->gv == 0) ? 0 : 1/($this->rt/$this->gv);
            for( $this->dy = 0; $this->dy <= $this->r; $this->dy++ ){
              for( $this->dx = 0; $this->dx <= $this->q; $this->dx++ ){
                $this->pxrgb = @imagecolorat($this->t, $this->dx, $this->dy);
                $this->rgb = @ImageColorsforIndex( $this->t, $this->pxrgb );
                $this->newcol = ($this->rr*$this->rgb['red'])+($this->br*$this->rgb['blue'])+($this->gr*$this->rgb['green']);
                $this->setcol = @ImageColorAllocate( $this->t, $this->newcol, $this->newcol, $this->newcol );
                @imagesetpixel( $this->t, $this->dx, $this->dy, $this->setcol );
              }
            }
          }
          //BOF - DokuMan - 2011-01-06
        }
        //EOF - DokuMan - 2011-01-06

        function ellipse($bg_colour="FFFFFF") {
          // Not working properly for PNG images, so skipping
          if ($this->effects_disabled || $this->k == 3)
            return; //DokuMan - 2011-01-06
          $this->bgc = $bg_colour;
          $this->br = $this->hex2rgb(substr($this->bgc,0,2));
          $this->bg = $this->hex2rgb(substr($this->bgc,2,2));
          $this->bb = $this->hex2rgb(substr($this->bgc,4,2));
          $this->dot = @ImageCreate(6,6);
          $this->dot_base = @ImageColorAllocate($this->dot, $this->br, $this->bg, $this->bb);
          $this->zenitha = @ImageColorClosest($this->t, $this->br, $this->bg, $this->bb);
          for($this->rad = 0;$this->rad<6.3;$this->rad+=0.005) {
            $this->xpos = floor(($this->q)+(sin($this->rad)*($this->q)))/2;
            $this->ypos = floor(($this->r)+(cos($this->rad)*($this->r)))/2;
            $this->xto = 0;
            if($this->xpos >= ($this->q/2)){
              $this->xto = $this->q;
            }
            @ImageCopyMerge($this->t,$this->dot,$this->xpos-3,$this->ypos-3,0,0,6,6,30);
            @ImageCopyMerge($this->t,$this->dot,$this->xpos-2,$this->ypos-2,0,0,4,4,30);
            @ImageCopyMerge($this->t,$this->dot,$this->xpos-1,$this->ypos-1,0,0,2,2,30);
            @ImageLine($this->t,$this->xpos,($this->ypos),$this->xto,($this->ypos),$this->zenitha);
          }
          @ImageDestroy($this->dot);
        }
        function round_edges($edge_rad=3, $bg_colour="FFFFFF", $anti_alias=1) {
          // Not working properly for PNG images, so skipping
          if ($this->effects_disabled || $this->k == 3)
            return; //DokuMan - 2011-01-06
          $this->er = $edge_rad;
          $this->bgd = $bg_colour;
          $this->aa = min(3,$anti_alias);
          $this->br = $this->hex2rgb(substr($this->bgd,0,2));
          $this->bg = $this->hex2rgb(substr($this->bgd,2,2));
          $this->bb = $this->hex2rgb(substr($this->bgd,4,2));
          $this->dot = @ImageCreate(1,1);
          $this->dot_base = @ImageColorAllocate($this->dot, $this->br, $this->bg, $this->bb);
          $this->zenitha = @ImageColorClosest($this->t, $this->br, $this->bg, $this->bb);
          for($this->rr = 0-$this->er; $this->rr <= $this->er; $this->rr++) {
            $this->ypos = ($this->rr < 0) ? $this->rr+$this->er-1 : $this->r-($this->er-$this->rr);
            for($this->cr = 0-$this->er; $this->cr <= $this->er; $this->cr++) {
              $this->xpos = ($this->cr < 0) ? $this->cr+$this->er-1 : $this->q-($this->er-$this->cr);
              if($this->rr !== 0 || $this->cr !== 0) {
                $this->d_dist = round(sqrt(($this->cr*$this->cr)+($this->rr*$this->rr)));
                $this->opaci = ($this->d_dist < $this->er-$this->aa) ? 0 : max(0, 100-(($this->er-$this->d_dist)*33));
                $this->opaci = ($this->d_dist > $this->er) ? 100 : $this->opaci;
                @ImageCopyMerge($this->t,$this->dot,$this->xpos,$this->ypos,0,0,1,1,$this->opaci);
              }
            }
          }
          @imagedestroy($this->dot);
        }
        function merge($merge_img="", $x_left=0, $y_top=0, $merge_opacity=70, $trans_colour="FF0000") {
          if ($this->effects_disabled)
            return; //DokuMan - 2011-01-06
          $this->mi = $merge_img;
          $this->xx = ($x_left < 0) ? $this->q+$x_left : $x_left;
          $this->yy = ($y_top < 0) ? $this->r+$y_top : $y_top;
          $this->mo = $merge_opacity;
          $this->tc = $trans_colour;
          $this->tr = $this->hex2rgb(substr($this->tc,0,2));
          $this->tg = $this->hex2rgb(substr($this->tc,2,2));
          $this->tb = $this->hex2rgb(substr($this->tc,4,2));
          $this->md = @getimagesize($this->mi);
          $this->mw = $this->md[0];
          $this->mh = $this->md[1];
          $this->mm = ($this->md[2] < 4) ? ($this->md[2] < 3) ? ($this->md[2] < 2) ? imagecreatefromgif($this->mi) : imagecreatefromjpeg($this->mi) : imagecreatefrompng($this->mi) : Null;
          for($this->ypo = 0; $this->ypo < $this->mh; $this->ypo++) {
            for($this->xpo = 0; $this->xpo < $this->mw; $this->xpo++) {
              $this->indx_ref = @imagecolorat($this->mm, $this->xpo, $this->ypo);
              $this->indx_rgb = @imagecolorsforindex($this->mm, $this->indx_ref);
              if(($this->indx_rgb['red'] == $this->tr) && ($this->indx_rgb['green'] == $this->tg) && ($this->indx_rgb['blue'] == $this->tb)) {
                // transparent colour, so ignore merging this pixel
              } else {
                @imagecopymerge($this->t, $this->mm, $this->xx+$this->xpo, $this->yy+$this->ypo, $this->xpo, $this->ypo, 1, 1, $this->mo);
              }
            }
          }
          @imagedestroy($this->mm);
        }
        function frame($light_colour="FFFFFF", $dark_colour="000000", $mid_width=4, $frame_colour = "" ) {
          if ($this->effects_disabled)
            return; //DokuMan - 2011-01-06
          $this->rw = $mid_width;
          $this->dh = $dark_colour;
          $this->lh = $light_colour;
          $this->frc = $frame_colour;
          $this->fr = $this->hex2rgb(substr($this->dh,0,2));
          $this->fg = $this->hex2rgb(substr($this->dh,2,2));
          $this->fb = $this->hex2rgb(substr($this->dh,4,2));
          $this->gr = $this->hex2rgb(substr($this->lh,0,2));
          $this->gg = $this->hex2rgb(substr($this->lh,2,2));
          $this->gb = $this->hex2rgb(substr($this->lh,4,2));
          $this->zen = @ImageColorClosest($this->t, $this->gr, $this->gg, $this->gb);
          $this->nad = @ImageColorClosest($this->t, $this->fr, $this->fg, $this->fb);
          $this->mid = ($this->frc == "") ? @ImageColorClosest($this->t, ($this->gr+$this->fr)/2, ($this->gg+$this->fg)/2, ($this->gb+$this->fb)/2) : ImageColorClosest($this->t, $this->hex2rgb(substr($this->frc,0,2)), $this->hex2rgb(substr($this->frc,2,2)), $this->hex2rgb(substr($this->frc,4,2)));
          @imageline($this->t, 0, 0, $this->q, 0, $this->zen);
          @imageline($this->t, 0, 0, 0, $this->r, $this->zen);
          @imageline($this->t, $this->q-1, 0, $this->q-1, $this->r, $this->nad);
          @imageline($this->t, 0, $this->r-1, $this->q, $this->r-1, $this->nad);
          @imageline($this->t, $this->rw+1, $this->r-($this->rw+2), $this->q-($this->rw+2), $this->r-($this->rw+2), $this->zen); // base in
          @imageline($this->t, $this->q-($this->rw+2), $this->rw+1, $this->q-($this->rw+2), $this->r-($this->rw+2), $this->zen); // base right
          @imageline($this->t, $this->rw+1, $this->rw+1, $this->q-($this->rw+1), $this->rw+1, $this->nad);
          @imageline($this->t, $this->rw+1, $this->rw+1, $this->rw+1, $this->r-($this->rw+1), $this->nad);
          for($this->crw = 0; $this->crw < $this->rw; $this->crw++){
            @imageline($this->t, $this->crw+1, $this->crw+1, $this->q-($this->crw+1), $this->crw+1, $this->mid); // top
            @imageline($this->t, $this->crw+1, $this->r-($this->crw+2), $this->q-($this->crw+1), $this->r-($this->crw+2), $this->mid); // base
            @imageline($this->t, $this->crw+1, $this->crw+1, $this->crw+1, $this->r-($this->crw+1), $this->mid); // left
            @imageline($this->t, $this->q-($this->crw+2), $this->crw, $this->q-($this->crw+2), $this->r-($this->crw+1), $this->mid); // right
          }
        }
        function drop_shadow($shadow_width, $shadow_colour="000000", $background_colour="FFFFFF") {
          // Not working properly for PNG & GIF images, so skipping
          if ($this->effects_disabled || $this->k == 3 || $this->k == 1)
            return; //DokuMan - 2011-01-06
          $this->sw = $shadow_width;
          $this->sc = $shadow_colour;
          $this->sbr = $background_colour;
          $this->sr = $this->hex2rgb(substr($this->sc,0,2));
          $this->sg = $this->hex2rgb(substr($this->sc,2,2));
          $this->sb = $this->hex2rgb(substr($this->sc,4,2));
          $this->sbrr = $this->hex2rgb(substr($this->sbr,0,2));
          $this->sbrg = $this->hex2rgb(substr($this->sbr,2,2));
          $this->sbrb = $this->hex2rgb(substr($this->sbr,4,2));
          $this->dot = @ImageCreate(1,1);
          $this->dotc = @ImageColorAllocate($this->dot, $this->sr, $this->sg, $this->sb);
          $this->v = @imagecreatetruecolor($this->q, $this->r);
          $this->sbc = @imagecolorallocate($this->v, $this->sbrr, $this->sbrg, $this->sbrb);
          $this->rsw = $this->q-$this->sw;
          $this->rsh = $this->r-$this->sw;
          @imagefill($this->v, 0, 0, $this->sbc);
          for($this->sws = 0; $this->sws < $this->sw; $this->sws++) {
            $this->s_opac = max(0, 90-($this->sws*(100 / $this->sw)));
            for($this->sde = $this->sw; $this->sde < $this->rsh+$this->sws+1; $this->sde++) {
              @imagecopymerge($this->v, $this->dot, $this->rsw+$this->sws, $this->sde, 0, 0, 1, 1, $this->s_opac);
            }
            for($this->bse = $this->sw; $this->bse < $this->rsw+$this->sws; $this->bse++){
              @imagecopymerge($this->v, $this->dot, $this->bse, $this->rsh+$this->sws, 0, 0, 1, 1, $this->s_opac);
            }
          }
          @imagecopyresampled($this->v, $this->t, 0, 0, 0, 0, $this->rsw, $this->rsh, $this->q, $this->r);
          @imagecopyresampled($this->t, $this->v, 0, 0, 0, 0, $this->q, $this->r, $this->q, $this->r);
          @imagedestroy($this->v);
          @imagedestroy($this->dot);
        }
        function motion_blur($num_blur_lines, $background_colour="FFFFFF") {
          // Not working properly for PNG images, so skipping
          if ($this->effects_disabled || $this->k == 3)
            return; //DokuMan - 2011-01-06
          $this->nbl = $num_blur_lines;
          $this->shw = ($this->nbl*2)+1;
          $this->bk = $background_colour;
          $this->kr = $this->hex2rgb(substr($this->bk,0,2));
          $this->kg = $this->hex2rgb(substr($this->bk,2,2));
          $this->kb = $this->hex2rgb(substr($this->bk,4,2));
          $this->w = @imagecreatetruecolor($this->q, $this->r);
          $this->shbc = @imagecolorallocate($this->w, $this->kr, $this->kg, $this->kb);
          $this->rsw = $this->q-$this->shw;
          $this->rsh = $this->r-$this->shw;
          @imagefill($this->w, 0, 0, $this->shbc);
          $this->rati = $this->r / $this->rsh;
          for($this->lst = 0; $this->lst < $this->nbl; $this->lst++) {
            $this->opacit = max(0, 70-($this->lst*(85 / $this->nbl)));
            for($this->yst = 0; $this->yst < $this->rsh; $this->yst++) {
              @imagecopymerge($this->w, $this->t, $this->rsw+(2*$this->lst)+1, $this->yst+(2*$this->lst)+2, $this->q-1, $this->yst*$this->rati, 1, 1, $this->opacit);
            }
            for($this->xst = 0; $this->xst < $this->rsw; $this->xst++){
              @imagecopymerge($this->w, $this->t, $this->xst+(2*$this->lst)+1, $this->rsh+(2*$this->lst)+1, $this->xst*$this->rati, $this->r-1, 1, 1, $this->opacit);
            }
          }
          @imagecopyresampled($this->w, $this->t, 0, 0, 0, 0, $this->rsw, $this->rsh, $this->q, $this->r);
          @imagecopyresampled($this->t, $this->w, 0, 0, 0, 0, $this->q, $this->r, $this->q, $this->r);
          @imagedestroy($this->w);
        }
        function manipulate() {
          if($this->c !== "" && $this->s !== Null) {
            eval("\$this->maniparray = array(".$this->c.");");
            foreach($this->maniparray as $manip) {
              eval("\$this->".$manip.";");
            }
          }
        }
        function create() {
          if($this->s !== Null) {
            if($this->d !== "") {
              //BOF - DokuMan - 2011-01-06 - support jpg, gif and png
              ob_start();
              $image_type = $this->k;
              switch ($image_type) {
                case 1:
                  // Keep transparent color
                  $transcol = imagecolortransparent($this->s);
                  imagecolortransparent($this->t, $transcol);
                  imagegif($this->t, $this->d);
                  break;

                // PNG image
                case 3:
                  imagealphablending($this->t, true);
                  imagesavealpha($this->t, true);
                  imagepng($this->t, $this->d);
                  break;

                // Other images
                default:
                  imageinterlace($this->t, true);
                  imagejpeg($this->t, $this->d, $this->e);
              }
              ob_end_clean();
              //EOF - DokuMan - 2010-01-06 - support jpg, gif and png
            }
            imagedestroy($this->s);
            imagedestroy($this->t);
          }
        }

        function correctImageOrientation($resource_file) {
          if (function_exists('exif_read_data') && function_exists('exif_imagetype') && exif_imagetype($resource_file) == IMAGETYPE_JPEG) {
            $exif = exif_read_data($resource_file);
            if($exif && isset($exif['Orientation'])) {
              $orientation = $exif['Orientation'];
              if($orientation != 1){
                $img = imagecreatefromjpeg($resource_file);
                $deg = 0;
                switch ($orientation) {
                  case 3:
                    $deg = 180;
                    break;
                  case 6:
                    $deg = 270;
                    break;
                  case 8:
                    $deg = 90;
                    break;
                }
                if ($deg) {
                  $img = imagerotate($img, $deg, 0);        
                }
                imagejpeg($img, $resource_file, 100);
                imagedestroy($img);
              }
            }
          }
               
          return $resource_file;    
        }

      }
    ?>
     

    Gruss
    Hanspeter
    10 Antworten
    7552 Aufrufe
    16. Mai 2011, 16:30:26 von RossiRat
    1 Antworten
    2417 Aufrufe
    18. Februar 2010, 22:41:46 von guensi
    12 Antworten
    7940 Aufrufe
    20. Januar 2012, 10:14:44 von Tomcraft
    5 Antworten
    3634 Aufrufe
    20. Februar 2012, 22:49:57 von Soeldner