badcoder: Bild auslesen

Hallo zusammen,

ich möchte die RGB-Werte eines Bildes mit Hilfe von PHP ermitteln.
Hierzu verwende ich folgenden Code:

  
$imageFilename = "3x3.png";  
$image = imagecreatefrompng ( $imageFilename );  
  
$x = floatval( 0 );  
$y = floatval( 0 );  
$rgb = imagecolorat ( $image , $x , $y );  
  
$colors = imagecolorsforindex ( $image , $rgb );  
  
var_dump ( $colors );  

Soweit so gut. PHP gibt mir die RGB-Werte des Pixels (0,0) aus.

Jedoch möchte ich die RGB-Werte aller im Bild vorhandenen Pixel ermitteln und in einem Array sammeln. Dies habe ich mit Hilfe einer for-Schleife versucht, jedoch bin ich nicht zu einem brauchbaren Ergebnis gekommen. Es müsste die Bilddatei zeilenweise (von links nach rechts und von oben nach unten) ausgelesen werden, wobei die Breite und Höhe jeweils minus 1 Pixel die Schleife beenden sollten.

  1. Hi,

    $imageFilename = "3x3.png";

    $image = imagecreatefrompng ( $imageFilename );

    $x = floatval( 0 );
    $y = floatval( 0 );

      
    was bringt dich auf die Idee, für die x- und y-Koordinaten hier float-Werte zu erzwingen? In meiner Welt sind die Pixelkoordinaten von Rastergrafiken ganzzahlig.  
      
    
    > ~~~php
    
    $rgb = imagecolorat ( $image , $x , $y );  
    
    > $colors = imagecolorsforindex ( $image , $rgb );
    
    

    Du setzt voraus, dass es sich um ein palettenindiziertes Bild handelt? - Denn bei einem Truecolor-Bild (JPEG oder 24bit-PNG) hättest du allein mit imagecolorat() schon die tatsächliche Farbe.

    Jedoch möchte ich die RGB-Werte aller im Bild vorhandenen Pixel ermitteln und in einem Array sammeln. Dies habe ich mit Hilfe einer for-Schleife versucht, jedoch bin ich nicht zu einem brauchbaren Ergebnis gekommen.

    Das ist nicht verwunderlich, denn da du Pixelzeilen und -spalten hast, brauchst du zwei ineinander verschachtelte Schleifen.

    Es müsste die Bilddatei zeilenweise (von links nach rechts und von oben nach unten) ausgelesen werden, wobei die Breite und Höhe jeweils minus 1 Pixel die Schleife beenden sollten.

    Genau. Das Prinzip scheint dir klar zu sein. Wo also bist du gescheitert? Wie sah dein Ansatz aus?

    Unabhängig von der Theorie: Wenn dein Bild mehr als nur Briefmarkengröße hat, wird das Script sehr viel Zeit brauchen. Zeit, die es möglicherweise nicht bekommt, weil bei den meisten Hostern die Ausführungszeit begrenzt ist. Und ja, 30 Sekunden kommen bei Pixel-für-Pixel-Operationen schnell zusammen.

    So long,
     Martin

    --
    Ich wollt', ich wär ein Teppich.
    Dann könnte ich morgens liegenbleiben.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      vielen Dank.

      was bringt dich auf die Idee, für die x- und y-Koordinaten hier float-Werte zu erzwingen? In meiner Welt sind die Pixelkoordinaten von Rastergrafiken ganzzahlig.

      Das war nicht ganz wohl überlegt von mir. ;-)

      Das ist nicht verwunderlich, denn da du Pixelzeilen und -spalten hast, brauchst du zwei ineinander verschachtelte Schleifen.
      Genau. Das Prinzip scheint dir klar zu sein. Wo also bist du gescheitert? Wie sah dein Ansatz aus?

      Ja, richtig. Das Prinzip ist für mich eingängig. Das Problem ist, dass ich nicht weiß, wie ich die Schleifen verschachteln muss bzw. wie ich die Positionswerte x und y in der Schleife behandel.

      1. n'Abend,

        was bringt dich auf die Idee, für die x- und y-Koordinaten hier float-Werte zu erzwingen? In meiner Welt sind die Pixelkoordinaten von Rastergrafiken ganzzahlig.
        Das war nicht ganz wohl überlegt von mir. ;-)

        ah, gut dass ich gefragt habe. ;-)

        Genau. Das Prinzip scheint dir klar zu sein. Wo also bist du gescheitert? Wie sah dein Ansatz aus?
        Ja, richtig. Das Prinzip ist für mich eingängig. Das Problem ist, dass ich nicht weiß, wie ich die Schleifen verschachteln muss bzw. wie ich die Positionswerte x und y in der Schleife behandel.

        Hmm. Das ist doch eigentlich logisch, dachte ich.
        Also gut. Die Abmessungen des Bildes bekommst du am einfachsten mit getimagesize(), das hast du vermutlich selbst schon herausgefunden. Du brauchst also eine äußere Schleife, die die Zeilen von 0 bis $ymax-1 zählt, und darin eine innere Schleife, die mit jedem Wert von y erneut die Spalten von 0 bis $xmax-1 durchzählt. Als Schleifentyp bietet sich hier die traditionelle for-Schleife an, da Start- und Endwert eindeutig bekannt sind:

        for ($y=0; $y<$height; $y++)  
         { for ($x=0; $x<$width; $x++)  
            { ...  
              ...  
            }  
         }
        

        Jetzt kommst du selbst weiter. Oder?

        Ciao,
         Martin

        --
        Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Beim Universum bin ich mir aber nicht ganz sicher.
          (Albert Einstein, deutscher Physiker)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. n'Abend,

          for ($y=0; $y<$height; $y++)

          { for ($x=0; $x<$width; $x++)
              { ...
                ...
              }
          }

          
          >   
          > Jetzt kommst du selbst weiter. Oder?  
            
          Super. Vielen, vielen Dank!! :-D
          
  2. Hi,

    Jedoch möchte ich die RGB-Werte aller im Bild vorhandenen Pixel ermitteln und in einem Array sammeln.

    könntest du uns sagen, was genau du vorhast? vielleicht gibt es performantere Lösungen für dein Problem...

    grüße
    rudi