Durchschnitt

Ausnahmsweise gibt es dieses Mal keinen Artikel zum Thema Fotografie. Indirekt geht es aber um Bilder. Ich habe den folgenden PHP-Code geschrieben, um mir die durchschnittliche Farbe eines Bildes auszurechnen. Diesen RGB-Wert konnte ich danach als Hintergrund für die Seite verwenden, die meine Fotos auf Flickr anzeigt. Der Code setzt das GD-Modul für PHP voraus.

PHP:
  1. // $imagepath ist der Pfad zur lokalen JPEG-Datei, z.B. einem Thumbnail
  2. // des Bildes, dessen Farbe ermittelt werden soll.
  3. $src = @imagecreatefromjpeg($imagepath);
  4. if ($src) {
  5.   $src_width  = imagesx($src);
  6.   $src_height = imagesy($src);
  7.   $dst        = imagecreatetruecolor(1, 1);
  8.   imagecopyresampled($dst, $src, 0, 0, 0, 0, 1, 1, $src_width, $src_height);
  9.   $color = imagecolorat($dst, 0, 0);
  10.   $alpha = ($color>> 24) & 0xFF;
  11.   $red   = ($color>> 16) & 0xFF;
  12.   $green = ($color>> 8) & 0xFF;
  13.   $blue  = ($color) & 0xFF;
  14.   imagedestroy($src);
  15.   imagedestroy($dst);
  16. }

8 Kommentare

  1. Martin Wolf
    Am 15.01.2009

    Coole Idee. Finde es auch gut anzusehen. Bin mir aber nicht ganz sicher, ob ich das selbst wirklich nutzen wollen würde. ;)

  2. Benedikt
    Am 15.01.2009

    Nette Idee. Frage mich ob das in allen fällen eine schöne & passende Farbe generiert, aber es sieht zumindest in deinen Beispielen so aus.

  3. Andreas
    Am 15.01.2009

    Danke.

    Es ist okay genug für mich – vor allem vor dem Hintergrund dass 99% derjenigen die meine Fotos betrachten das eh bei Flickr machen.

    Als nächsten Schritt könnte man auch komplementäre Töne ausrechnen, um die anderen Elemente der individualisierten Foto-Ansicht zu optimieren.

  4. Guido
    Am 19.01.2009

    So ganz passt das aber nicht, oder?
    http://96dpi.de/flickr/photo/show/3206661372
    Der rechnerische Durchschnitt wäre ein Grauwert von 212. Tatsächlich wird ein Hintergrund mit Grauwert 105 verwendet? Oder rechnest Du das bewusst dunkler?

    Die Interpolation von ImagecopyResampled ist hier übrigens sehr gut. Wenn man ein Script mal Pixel für Pixel im Bild analysieren lässt und so den mathematischen Durchschnitt errechnet, so weicht das Ergebnis nur minimal vom Farbwert des mit ImageCopyResampled erzeugten Pixels ab.

  5. Andreas
    Am 19.01.2009

    Ich halbiere auf meiner Webseite die Helligkeit jedes Kanals auf die Hälfte, richtig. Im Moment überlege ich auch, das Script um Funktionen zur Festlegung von Komplementärfarben für Schrift und Co. zu erweitern.

  6. Jakob
    Am 21.01.2009

    Nette Idee. Allerdings würde ich auf jeden Fall die Ergebnisse (zumindestens zwischen) speichern. Weil so dauert das Laden jetzt relativ lange.

    PS: Die Fotoseite ist nicht Fenstergrößenänderungskompatibel ;)

  7. Jakob
    Am 21.01.2009

    Achso. Das ganze muss eigentlich so aussehen.

    function ambilight($imagepath){
    [...]
    }

    :-P

  8. Andreas
    Am 21.01.2009

    Ahhhh! Nicht das ich jetzt von einem großen Hersteller von Unterhaltungselektronik abgemahnt werde. Die Performance der Fotoseite ist insgesamt (und auch schon vorher) Mist. Das liegt u.a. daran, dass ich zu viele API-Calls pro Seite brauche, weil die Persistenz noch nicht gut genug entwickelt ist.

Kommentieren

96dpi.de wird mit Wordpress betrieben. Meine aktuellen Fotos findest Du bei Flickr. Video-Tutorials veröffentliche ab und zu bei YouTube. Ich empfehle den RSS-Feed dieser Seite, wenn Du dich regelmäßig über Neuigkeiten hier informieren möchtest. Um mir eine Frage zu stellen ist das Kontaktformular der beste Weg.