Rolf B: Rekursive Funktion liefert ungewünschtes Ergebnis

Beitrag lesen

Hallo Jochen,

indem man die Zeile sofort abbricht, nachdem das erste nicht weiße Pixel gefunden wurde.

Das solltest Du auf jeden Fall tun.

Knapp über einer halben Sekunde Arbeit, das ist ok.

Nein, das ist für einen Webserver eine halbe Ewigkeit. Vorher hast Du ja auch noch das Bild generiert.

Hast Du mal den PixelRegionIterator und isPixelSimilar ausprobiert?

                                          // x  y   width height
$areaIterator = $img->getPixelRegionIterator(0, 500, 530, 342);
$white = new ImagickPixel("#ffffff");

foreach ($areaIterator as $row => $rowIterator) {
    foreach ($rowIterator as $pixel) {
        if ($pixel->IsPixelSimilar($white, 0.01)) {
        // "weiß genug"
        }
        else {
        // nicht weiß
        }
    }
    // Warum auch immer Imagick das so will, aber es gehört zum Mantra
    // des Iterators, ihn nach jedem Lauf eines Zeileninterators zu 
    // resynchronisieren
    $areaIterator->syncIterator();
}

Der Wert 0.01 bei isPixelSimilar ist der Unschärfewert für den Vergleich. Imagick bestimmt den Abstand zweier Farben im RGB Farbwürfel (also Differenz rot zum Quadrat, Differenz grün zum Quadrat, Differenz blau zum Quadrat, aufsummieren, Wurzel ziehen). Wobei die Farbwerte nicht von 0 bis 255 gehen, sondern auf 0 bis 1 skaliert werden.

Der Unterschied zwischen "rgb(255,255,255)" und "rgb(254,254,254)" ist

$$\displaystyle \sqrt{ \Big( \frac{1}{255} \Big) ^ 2 + \Big( \frac{1}{255} \Big) ^ 2 + \Big( \frac{1}{255} \Big) ^ 2 }   = \sqrt{3} \cdot \frac{1}{255}   \approx 0{,}0068 $$

das habe ich großzügig zu 0,01 aufgerundet. Wie Transparenz sich auswirkt, weiß ich nicht.

Rolf

--
sumpsi - posui - obstruxi