iOS Wie berechnet man die Anzahl der Pixel / Fläche, die von einer Kurve eingeschlossen sind?

8

Ich habe eine willkürlich geformte Kurve, die einen Bereich umschließt. Ich möchte die Anzahl der Pixel angeben, die die Kurve auf einem iPhone / iPad-Bildschirm einschließt. Wie kann ich das tun?

  • Eine Kurve ist definiert als aufeinanderfolgende x / y-Koordinaten von Punkten.
  • Eine Kurve ist geschlossen.
  • Eine Kurve wird durch die Berührungen eines Benutzers (touchesMoved-Methode) und I gezeichnet habe kein Wissen darüber, wie es aussieht

Ich dachte daran, die geschlossene Kurve irgendwie mit Farbe zu füllen und dann die Anzahl der Pixel dieser Farbe in einem Screenshot eines Bildschirms zu berechnen. Dies bedeutet, dass ich wissen muss, wie man eine geschlossene Kurve programmatisch mit Farbe füllt.

Gibt es einen anderen Weg, an den ich nicht denke?

Danke!

    
Alex Stone 08.01.2013, 17:28
quelle

2 Antworten

8

Lassen Sie uns dies tun, indem Sie einen Quartz-Pfad erstellen, der Ihre Kurve einschließt. Dann erstellen wir einen Bitmap-Kontext und füllen den Pfad in diesem Kontext. Dann können wir die Bitmap untersuchen und die Pixel zählen, die gefüllt wurden. Wir werden das alles in einer praktischen Funktion verpacken:

%Vor%

Zuerst müssen wir den Pfad erstellen:

%Vor%

Dann müssen wir die Bounding Box des Pfades bekommen. CGPoint -Koordinaten müssen keine Ganzzahlen sein, aber eine Bitmap muss ganzzahlige Dimensionen haben, daher erhalten wir eine ganzzahlige Begrenzungsbox, die mindestens so groß ist wie die Begrenzungsbox des Pfads:

%Vor%

Wir müssen auch entscheiden, wie groß (in Bytes) die Bitmap ist:

%Vor%

Jetzt können wir die Bitmap erstellen:

%Vor%

Die Bitmap wird beim Erstellen mit Schwarz gefüllt. Wir füllen den Pfad mit Weiß:

%Vor%

Jetzt sind wir mit dem Pfad fertig, damit wir ihn freigeben können:

%Vor%

Als nächstes berechnen wir den Bereich, der ausgefüllt wurde:

%Vor%

Jetzt sind wir fertig mit dem Bitmap-Kontext, damit wir ihn freigeben können:

%Vor%

Schließlich können wir das von uns berechnete Gebiet zurückgeben:

%Vor%

Nun, das war einfach! Aber wir müssen all diese Hilfsfunktionen schreiben. Fangen wir oben an. Erstellen des Pfades ist trivial:

%Vor%

Auch das Integrieren der Begrenzungsbox des Pfades ist trivial:

%Vor%

Um die Bytes pro Zeile der Bitmap auszuwählen, könnten wir einfach die Breite der Begrenzungsbox des Pfades verwenden. Aber ich denke, dass Quartz Bitmaps hat, die ein Vielfaches einer netten Zweierpotenz sind. Ich habe diesbezüglich noch keine Tests gemacht, also sollten Sie vielleicht experimentieren. Für den Moment werden wir die Breite auf das nächstkleinste Vielfache von 64 runden:

%Vor%

Wir erstellen den Bitmap-Kontext mit den berechneten Größen. Wir müssen auch den Ursprung des Koordinatensystems übersetzen. Warum? Weil der Ursprung der Begrenzungsbox des Pfades möglicherweise nicht bei (0, 0) liegt.

%Vor%

Schließlich müssen wir den Helfer schreiben, der die gefüllten Pixel zählt. Wir müssen entscheiden, wie wir Pixel zählen wollen. Jedes Pixel wird durch eine vorzeichenlose 8-Bit-Ganzzahl dargestellt. Ein schwarzes Pixel ist 0. Ein weißes Pixel ist 255. Die Zahlen dazwischen sind Graustufen. Quarz aliasiert den Rand des Pfades, wenn er ihn mit grauen Pixeln füllt. Also müssen wir entscheiden, wie diese grauen Pixel zu zählen sind.

Eine Möglichkeit besteht darin, einen Schwellenwert wie 128 zu definieren. Jedes Pixel auf oder über dem Schwellenwert gilt als gefüllt; der Rest zählt als ungefüllt.

Eine andere Möglichkeit besteht darin, die grauen Pixel als teilweise gefüllt zu zählen und diese teilweise Füllung zu addieren. So werden zwei genau halb gefüllte Pixel kombiniert und zählen als ein einzelnes, vollständig gefülltes Pixel. Lass es uns so machen:

%Vor%

Sie können den gesamten Code finden, der in diesem Kern gebündelt ist.

    
rob mayoff 11.01.2013, 22:30
quelle
0

Ich würde die Zeichnung als CGIMage greifen ...

(CGBitmapContextCreateImage (UIGraphicsGetCurrentContext ());

Verwenden Sie dann, wie oben empfohlen, einen "Flood Fill" -Ansatz, um die Pixel zu zählen. (Google Flood Fill)

    
Greycon 08.01.2013 18:17
quelle

Tags und Links