Richard: Ich will doch bloß eine Farbe in die Hand...

Hallo,

mit welcher PHP-Funktion kann man ein ganz einfaches Farbhandle o.ä. zurückgeben. Ich finde nirgendwo etwas in der Art. imagecolorresolve() geht nicht. Warum erwarten _alle_ diese color-Funktionen eigentlich als ersten Parameter ein Bildhandle, das ist doch völlig unerheblich. Ich will einfach nur eine Farbe haben, um sie später zu verwenden. Wenn ich das Bild als Parameter angebe, füllt PHP das Bild immer gleich mit dieser Farbe auf, das will ich aber nicht.

Beste Grüße

  1. habe d'ehre Richard

    Hallo,

    mit welcher PHP-Funktion kann man ein ganz einfaches Farbhandle o.ä. zurückgeben. Ich finde nirgendwo etwas in der Art. imagecolorresolve() geht nicht. Warum erwarten _alle_ diese color-Funktionen eigentlich als ersten Parameter ein Bildhandle, das ist doch völlig unerheblich. Ich will einfach nur eine Farbe haben, um sie später zu verwenden. Wenn ich das Bild als Parameter angebe, füllt PHP das Bild immer gleich mit dieser Farbe auf, das will ich aber nicht.

    Was willst Du denn mit der Farbe sonst anstellen wenn nicht in einem Image verwenden?

    man liest sich
    Wilhelm

    1. Hallo,

      Was willst Du denn mit der Farbe sonst anstellen wenn nicht in einem Image verwenden?

      Die Frage hab ich befürchtet, also pass auf:

      Den Bildhintergrund fülle ich mit einer Farbe deren R, G und B-Wert zufällig (mit rand) bestimmt wird, allerdings nur im Bereich von 128..255 (sozusagen die hellere Hälfte).

      Die Schrift soll dann genau die gegenteilige Farbe erhalten. Dazu wird jeder R, G und B-Wert des Hintergrundes von 255 abgezogen. Dann bestünde ein ausreichneder Kontrast. Und diese "Komplementärfarbe" wollte ich gerne zurückgegeben haben. Dafür habe ich imagecolorresolve verwendet, aber dann wurde gleich das ganze Bild damit ausgefüllt, und das will ich eben nicht...

      Beste Grüße

      1. habe d'ehre Richard

        Den Bildhintergrund fülle ich mit einer Farbe deren R, G und B-Wert zufällig (mit rand) bestimmt wird, allerdings nur im Bereich von 128..255 (sozusagen die hellere Hälfte).

        Was hindert Dich daran, die fuer die Schrift noetigen einzelnen RGB-Werte auszurechnen und mit "imagecolorallocate" in einer Variablen zu speichern? Oder versehe ich etwas voellig falsch?

        man liest sich
        Wilhelm

        1. Hallo,

          Was hindert Dich daran, die fuer die Schrift noetigen einzelnen RGB-Werte auszurechnen und mit "imagecolorallocate" in einer Variablen zu speichern? Oder versehe ich etwas voellig falsch?

          Genau das klappt ja nicht. Auch imagecolorallocate füllt das gesamte Bild auf. Damit verpasse ich ihm ja schon die Hintergrundfarbe, sowas wie imagefill brauch ich gar nicht, was mich ein wenig beängstigt.

          Beste Grüße

          1. habe d'ehre Richard

            Genau das klappt ja nicht. Auch imagecolorallocate füllt das gesamte Bild auf. Damit verpasse ich ihm ja schon die Hintergrundfarbe, sowas wie imagefill brauch ich gar nicht, was mich ein wenig beängstigt.

            Hmhh!

            Mal ein Beispiel von mir, wie ich eine Wasserzeichenkopie fuer eine Bilderuebersicht schreibe (d.h. ein originalbild existiert bereits)

            $imgA = imagecreatefromjpeg($file);
            $font_c = imagecolorallocate($imgA,0x66,0x66,0x66);
            imagettftext($imgA, 20, 0, 20, $wzPosH, $font_c, "arialbd.ttf", "(c) blubber");
            $imgB = @imagecreatetruecolor($iNewWidth, $iNewHeight);
            @imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewWidth, $iNewHeight, $iOldwidth[0], $iOldHeight[1]);
            imagejpeg($imgB, $save);

            Du muesstest doch statt imagecreafromjpeg nur ein image mit Deiner Hintergrundfarbe erzeugen und dann Deinen Text reinschreiben, das neue Bild erzeugen und Dein Ausgangsbild wieder loeschen.

            man liest sich
            Wilhelm

            1. Hallo Wilhelm,

              Das hilft mir leider auch nicht wirklich weiter, allerdings verwende ich gif als Grafikformat, kann das ein Problem sein?

              Außerdem gibt es doch genügend Funktionen, die als Parameter auch eine Farbe haben wollen. Also muss so eine Farbe doch auch irgendwie greifbar sein. Ich suche einfach so etwas wie:

              getcolor($r, $g, $b);

              Beste Grüße

      2. Hi!

        Den Bildhintergrund fülle ich mit einer Farbe deren R, G und B-Wert zufällig (mit rand) bestimmt wird, allerdings nur im Bereich von 128..255 (sozusagen die hellere Hälfte).

        Die Schrift soll dann genau die gegenteilige Farbe erhalten. Dazu wird jeder R, G und B-Wert des Hintergrundes von 255 abgezogen. Dann bestünde ein ausreichneder Kontrast.

        Was ist bei RGB(128,128,128)? je näher du an diesen Wert kommst, umso kleiner wird der Konstrast.

        Gruß aus Iserlohn

        Martin

        --
        Spiele dein Lied, aber zwinge die Melodie nicht der übrigen Menschheit auf.
        Selfcode: ie:{ fl:( br:^ va:) ls:# fo:| rl:( n4:( ss:| de:> js:) ch:? sh:( mo:| zu:)
  2. Moin!

    mit welcher PHP-Funktion kann man ein ganz einfaches Farbhandle o.ä. zurückgeben.

    Wieso brauchst du ein Farbhandle?

    Du erstellst zu irgendeinem Zeitpunkt einen 24-Bit-RGB-Wert. DEN mußt du speichern und danach in deine Farbpalette einsetzen und verwenden (Palette nur bei 8-Bit-Bildern, ansonsten verwendest du den Farbwert direkt).

    Und mit dem gespeicherten Wert kannst du auch den invertierten Farbwert errechnen und auf die gleiche Weise verwenden.

    imagecolorresolve() geht nicht. Warum erwarten _alle_ diese color-Funktionen eigentlich als ersten Parameter ein Bildhandle, das ist doch völlig unerheblich.

    Nein, ist es nicht. Imagecolorresolve muß in der Farbpalette eines gegebenen 8-Bit-Bildes nachsehen, ob die gewünschte Farbe existiert, oder welche Farbe ihr am nächsten kommt. Da es keine Standardpalette für GIF-Bilder gibt, hängt das also immer konkret vom aktuellen Bild ab.

    Ich will einfach nur eine Farbe haben, um sie später zu verwenden. Wenn ich das Bild als Parameter angebe, füllt PHP das Bild immer gleich mit dieser Farbe auf, das will ich aber nicht.

    Ein leeres Bild hat noch keine Palette und als einzige Farbe den Farbindex Null. Ein Funktionsaufruf könnte dazu führen, dass als allererste Farbe für den Farbindex Null eben die gewünschte Farbe in die Palette eingetragen wird - damit ändert das gesamte Bild die Farbe.

    Du gehst anscheinend einfach in der falschen Reihenfolge vor. Zeig doch mal bitte Code!

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo Sven,

      OK, ich versteh bloß Bahnhof. Hier mein Quellcode:

        
      <?php  
        
      header( "Content-Type: image/gif" );  
        
      // Bildattribute  
      $height = 40;  
      $width = 150;  
        
      // Bild erzeugen  
      $pic = imagecreate( $width, $height );  
        
      // Farbwerte für Bildhintergrund  
      $r = rand(128, 255);  
      $g = rand(128, 255);  
      $b = rand(128, 255);  
        
      // Koordinaten der gestrichelten Linien  
      $dashed_x1 = $width - rand( 0, $width );  
      $dashed_y1 = 0;  
      $dashed_x2 = $dashed_x1 + 30;  
      $dashed_y2 = $height;  
        
      // Farbe der gestrichelten Linien  
      $dashed_r = 255 - $r;  
      $dashed_g = 255 - $g;  
      $dashed_b = 255 - $b;  
      $dashed_color = /* HIER SOLL DIE FARBE ERMITTELT WERDEN */  
        
      // Hintergrundfarbe ausfüllen  
      $bgcol = imagecolorallocate( $pic, $r, $g, $b );  
        
      // gestrichelte Linien zeichnen  
      imagedashedline( $pic, $dashed_x1, $dashed_y1, $dashed_x2, $dashed_y2, $dashed_color );  
        
      imagegif( $pic );  
        
      imagedestroy( $pic );  
        
      ?>  
      
      

      Beste Grüße

      1. Moin!

        OK, ich versteh bloß Bahnhof.

        Kann passieren. Ich erkläre dir mal, was in deinem Code passiert.

          
        
        > <?php  
        >   
        > header( "Content-Type: image/gif" );  
        >   
        > // Bildattribute  
        > $height = 40;  
        > $width = 150;  
        >   
        > // Bild erzeugen  
        > $pic = imagecreate( $width, $height );  
        
        // Damit erzeugst du ein Palettenbild für GIF. Die Farbpalette ordnet einem Index (Wertebereich 0..255) eine RGB-Farbe (#000000 .. #FFFFFF) zu.  
        
        >   
        > // Farbwerte für Bildhintergrund  
        > $r = rand(128, 255);  
        > $g = rand(128, 255);  
        > $b = rand(128, 255);  
        
        // Hier ermittelst du eine Zufallsfarbe für den Hintergrund und speicherst sie ganz normal in drei Variablen.  
        
        >   
        > // Koordinaten der gestrichelten Linien  
        > $dashed_x1 = $width - rand( 0, $width );  
        > $dashed_y1 = 0;  
        > $dashed_x2 = $dashed_x1 + 30;  
        > $dashed_y2 = $height;  
        >   
        > // Farbe der gestrichelten Linien  
        > $dashed_r = 255 - $r;  
        > $dashed_g = 255 - $g;  
        > $dashed_b = 255 - $b;  
        
        // und hier ermittelst du die Farbe deiner Linien und speicherst sie ebenfalls in drei Variablen.  
        
        > $dashed_color = /* HIER SOLL DIE FARBE ERMITTELT WERDEN */  
        
        // Du ermittelst weiter oben doch auch keine Farbe für deinen Hintergrund - warum also plötzlich hier?  
        
        >   
        > // Hintergrundfarbe ausfüllen  
        > $bgcol = imagecolorallocate( $pic, $r, $g, $b );  
        
        // Hier füllst du die Farbpalette mit deiner Hintergrundfarbe. Und laut Dokumentation setzt der erste Funktionsaufruf GLEICHZEITIG auch noch die Hintergrundfarbe des Bildes, sofern man denn Palettenbilder benutzt (TrueColor-Bilder arbeiten anders).  
        // Es fehlt noch, dass du auch deine Linienfarbe in diese Palette tust.  
        // imagecolorallocate gibt dir dann jeweils den Palettenindex zurück, den du zum Zeichnen als "Farbe" angeben mußt.  
        
        >   
        > // gestrichelte Linien zeichnen  
        > imagedashedline( $pic, $dashed_x1, $dashed_y1, $dashed_x2, $dashed_y2, $dashed_color );  
        
        // Wenn du oben den Farbindex von indexcolorallocate in $dashed_color speicherst, verwendest du die oben angegebene RGB-Farbe für deine Linien.  
        
        >   
        > imagegif( $pic );  
        >   
        > imagedestroy( $pic );  
        >   
        > ?>  
        
        

        Palettenbilder sind, wie du vielleicht merkst, etwas seltsamer zu behandeln, als man es vielleicht gewohnt ist. Du must dir mit imagecolorallocate() sozusagen einen "Tuschkasten" zusammensetzen. Die Tuschfarben können jeden beliebigen Farbwert annehmen, du sagst den Zeichenfunktionen danach dann aber nur noch, mit welcher Farbnummer in deinem numerierten Tuschkasten (mit auswechselbaren Tuschtöpfen) du jetzt malen willst.

        Bonusfunktion: Der Farbwert, den du als allererstes in den Tuschkasten packst, bestimmt dir außerdem die Farbe deines Malpapieres. Was technisch simpel erklärt ist: Ein frisch angelegtes Bild hat für jeden Pixel erstmal "Farbindex 0" gespeichert, und wenn diesem Farbindex eine Farbe zugewiesen wird, ändert der gesamte Hintergrund eben auf einen Schlag die Farbe.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Hallo Sven,

          // Du ermittelst weiter oben doch auch keine Farbe für deinen Hintergrund - warum also plötzlich hier?

          Weil imagedashedline() eine Farbe und nicht einzelne Farbwerte erwartet. Und deswegen will ich aus drei Farbwerten eine Farbe machen.

          // Hier füllst du die Farbpalette mit deiner Hintergrundfarbe. Und laut Dokumentation setzt der erste Funktionsaufruf GLEICHZEITIG auch noch die Hintergrundfarbe des Bildes, sofern man denn Palettenbilder benutzt (TrueColor-Bilder arbeiten anders).

          Ich habe aber den Eindruck, dass _jeder_ Aufruf von imagecolorallocate die Hintergundfarbe setzt. Wie erstelle ich den ein TrueColor-Bild?

          // Es fehlt noch, dass du auch deine Linienfarbe in diese Palette tust.

          Und wie?

          Palettenbilder sind, wie du vielleicht merkst, etwas seltsamer zu behandeln, als man es vielleicht gewohnt ist. Du must dir mit imagecolorallocate() sozusagen einen "Tuschkasten" zusammensetzen.

          Etwa so?:

            
          $blau = imagecolorallocate($img, 0, 0, 255);  
          $rot = imagecolorallocate($img, 0, 0, 255);  
          ...  
          
          

          Und dann kann ich diese Farben als $color-Parameter verwenden?

          Beste Grüße

          1. Hallo,

            Etwa so?:

            $blau = imagecolorallocate($img, 0, 0, 255);
            $rot = imagecolorallocate($img, 0, 0, 255);
            ...

              
            Ja so. Endlich sehe ich gestrichelte Linien.  
              
            Beste Grüße  
            
            -- 
            [Meine bescheidene Internetpräsenz](http://www.richardwotzlaw.de) - Gästebucheinträge erwünscht!  
              
            [Das beste Freeware-Programm der Welt](http://www.dasfussballstudio.de)  
            Selfcode: [ie:( fl:| br:^ va:| ls:\[ fo:) rl:( n4:| ss:| de:\[ js:| ch:? sh:( mo:) zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%28+fl%3A%7C+br%3A%5E+va%3A%7C+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%7C+ss%3A%7C+de%3A%5B+js%3A%7C+ch%3A%3F+sh%3A%28+mo%3A%29+zu%3A%7C)
            
      2. Hallo Freunde des gehobenen Forumsgenusses,

        <?php #[...]
        // Farbe der gestrichelten Linien
        $dashed_r = 255 - $r;
        $dashed_g = 255 - $g;
        $dashed_b = 255 - $b;

        [...]

        ?>

          
        Das soll also einen möglichst großen Kontrast ergeben?  
          
        Überlege dir mal, was passiert wenn $dashed\_(r|g|b) = 128 ist \*g\*  
          
        Meine Idee wäre mehr so etwas:  
        ~~~php
          
        <?php #[...]  
        // Farbe der gestrichelten Linien  
        $dashed_r = ($r + 128) % 256;  
        $dashed_g = ($g + 128) % 256;  
        $dashed_b = ($b + 128) % 256;  
        # [...]  
        ?>  
        
        

        Gruß
        Alexander Brock