2012-04-15 4 views
0

Ich möchte einen Code aus einem gegebenen Bild erstellen. Zum Beispiel dieses Bild:RMagick: Wie überprüft man, ob alle Pixel in einem bestimmten Bereich des Bildes transparent sind?

enter image description here

sollte den Code 111-111-010 bekommen.

(Angenommen, es ist ein png Bild und alle Pixel mit Ausnahme der Banane selbst sind transparent.)

Wenn alle Pixel in einem bestimmten Platz transparent sind, wird der Wert dieses Platzes 0 ist, ansonsten ist es 1.

So wird ein Bild gegeben, würde ich es Quadrate einer bestimmten Größe zu unterteilen möchte (zB das Bild Banane ist 300x300 Pixel, und die Quadrate sind 100x100) und dann einen Code (string) zu schaffen, die aufgebaut ist wie oben beschrieben.

Der einfachste Weg wäre wahrscheinlich mit each_pixel und nur manuell überprüfen, ob alle Pixel in einem Quadrat transparent sind. Gibt es eine bessere Methode?

Antwort

0

Ich würde Ihr vorhandenes Bild nehmen und schrumpfen sie zu dieser 3x3 Größe:

play = image.resize(3, 3, CubicFilter, 0.5) 

Dann können Sie den Code erstellen, indem jeder verbleibenden Pixel Überprüfung mit:

code = "" 
(0..2).each do |ix| 
    (0..2).each do |iy| 
    code += play.pixel_color(ix,iy).opacity == 65535 ? "0" : "1" 
    code += iy == 2 ? "-" : "" unless ix == 2 && iy == 2 
    end 
end 

Ich vergleiche Opazität 65535 weil, als ich ein Pixel inspizierte, wusste ich, dass es transparent war, das ist, was zurückgegeben wurde:

=> red=65535, green=65535, blue=65535, opacity=65535 
+0

Diese co de produziert '011-111-111'. Es sieht so aus, als hätte es den anderen transparenten Punkt verfehlt. –

Verwandte Themen