tutorials.de Buch-Aktion 02/2012
  • [PHP] [Codeschnipsel] ImageColor aus HTML-Farbcodierung erstellen

    Wer ab und zu mit Images in PHP arbeitet, der kennt das sicher. Die Farben werden über ImageColorAllocate() mit den RGB-Werten erstellt. Manchmal hat man den Wert aber aus verschiedenen Gründen als HTML-Farbwert vorliegen (zB. #FFFFFF).

    Diese Funktion erstellt ein Color für ein Image anhand des HTML-Wertes der Farbe.
    Das # kann mitgegeben oder weggelassen werden. Es wird nach 6 hexadezimalen Ziffern [:xdigit:] geprüft.
    Die Erklärungen zum Code habe ich der Einfachheit halber direkt in den Code geschrieben

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    /**
    * create a imageColor by a html #-Value (#FFFFFF, #00FFFF, FFFFFF etc.)
    * @param    Image
    * @param    String color als Hexwert
    * @return   ImageColor
    */
    function imageColorFromHtml(&$image, $color){
        //Der Pattern zum zerlegen des Strings in seine RGB-Werte. 
        //String beginnt mit oder ohne ein #. 
        //gefolgt von 3 mal 2 [:xdigit:] ([:xdigit:]:Hexadecimal digit characters) 
        //und endet danach
        $hex_color_pattern6 = '/^#?([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})$/';
        //Für die Kurzform ists dasselbe, einfach nur 3 [:xdigit:]
        $hex_color_pattern3 = '/^#?([[:xdigit:]])([[:xdigit:]])([[:xdigit:]])$/';
        //Falls es sich um eine Kurzform handelt, die Werte verdoppeln
        $color =  preg_replace($hex_color_pattern3, '\1\1\2\2\3\3', $color);
        //hexwert parsen
        if(!preg_match($hex_color_pattern6, $color, $rgb)) return false;
        //Gefundener Gesammtstring entfernen. Der erste Eintrag im Array ist der gesammte gefundene String.
        //Das brauchen wir ncht 
        array_shift($rgb);
        //Alle Hexwerte in Decimale Werte wandeln 
        //ERS: 20.01.2012: Array_walk durch array_map ersetzte 
        //array_walk($rgb, create_function('&$item, $key', '$item = hexdec($item);'));
        $rgb = array_map('hexdec', $rgb);
        //Und zuguter letzte mit ImageColorAllocate() und unseren RGB-Werten den ImageColor erstellen
        return ImageColorAllocate($image, $rgb[0], $rgb[1], $rgb[2]);
    }

    Und so kann dann das ganze angewendet werden....
    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    
    <?php
        header ("Content-type: image/png");
        $im = @ImageCreate (50, 100) or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
        //Hier kommt der Funktionsaufruf
        $text_color =imageColorFromHtml($im, '#0A0A0A');
        ImageString ($im, 1, 5, 5, "Ein Test-String", $text_color);
        ImagePNG ($im);
    ?>
     


    Yaslaw stellt dir diesen Artikel kostenlos zur Verfügung.
    Wenn du möchtest, dann kannst du Yaslaw hier gerne ein kleines Dankeschön spenden.

    Kommentare 3 Kommentare
    1. Avatar von _Grubi
      _Grubi -
      Ich bin besseren Code von dir gewohnt, sorry :/

      1) define in der Funktion ist eigentlich nicht gut, wirft ne Meldung bei aktiviertem error_reporting
      2) Warum array_walk mit extra Lambda-Funktion? array_map würde es auch tun. Zudem kommt man ans MemoryLimit, wenn man die Funktion nur oft genug benutzt.

      Vorschlag (anderer Ansatz):
      PHP-Code:
      function imageColorFromHtml(&$image$hexColor)
      {
          if(
      preg_match('/^#?([[:xdigit:]]{3}|[[:xdigit:]]{6})$/'$hexColor$rgb))
          {
              
      $rgb $rgb[1];
              if(
      strlen($rgb) === 3)
                  
      $rgb $rgb[0].$rgb[0].$rgb[1].$rgb[1].$rgb[2].$rgb[2];
              
      $rgb sscanf($rgb'%2x%2x%2x');
              return 
      ImageColorAllocate($image$rgb[0], $rgb[1], $rgb[2]);
          }
          return 
      false;

      Edit: Code angepasst. Hatte einen Denkfehler, auf den mich Dr Dau gebracht hat
    1. Avatar von Dr Dau
      Dr Dau -
      Ein Problem gibt es aber.
      #FFFFFF ist identisch mit #FFF (selbiges gilt z.b. auch für #BB33BB vs. #B3B).

      Wenn man die Funktion also für jedermann zugänglich machen will, sollte man am besten auch prüfen wie viele Zeichen angegeben wurden, da vermutlich nicht jeder den 3-stelligen Farbcode in einen 6-stelligen "übersetzen" kann und es dann nicht zu dem erwünschten Ergebnis führen würde.
    1. Avatar von Yaslaw
      Yaslaw -
      Naja, dass hat man davon wenn man eine seiner alten Funktionen veröffentlicht ohne jede Zeile mit dem aktuellsten Wissen zu hinterfragen.

      Danke für eure Einwände.
      @_Grubi
      Dein Ansatz ist sehr elegant. Ich habe trotzdem mal mein Array-Ansatz verbessert.
      define() ist raus, array_walk() ebenfalls. Warum ich diesen noch drin hatte ist mir eigentlich selber schleierhaft.

      @Dr Dau
      Uh.. ich habe solange kein HTML mehr gemacht. Die Kurzform kannte ich noch gar nicht. Hab sie aber jetzt eingebaut.
    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Was ist grün und kann quaken?