2009-05-14 4 views
1

Stellen Sie sich vor: Ich habe ein PNG-Bild, das Teddybär oder ein Dreieck zeigt. Etwas nicht quadratisches. Nun möchte ich herausfinden, an welchem ​​Punkt für eine bestimmte Zeile und Richtung (Koordinaten relativ zu dem Koordinatensystem von UIImageView) das tatsächlich sichtbare Bild beginnt.Wie kann ich automatisch die Koordinaten von Grenzen in einem PNG mit Transparenz finden?

Beispiel: Sagen wir, ich muss wissen, wo die Füße des Teddybären von links beginnen, wenn man die letzte Zeile betrachtet. Sicher, das ist nicht nur frame.origin.x, denn die Füße sind nicht quadratisch. Es kann irgendwo bei x = 12 beginnen.

Ich würde irgendwie über die Bilddaten iterieren und die Pixel überprüfen: "Hey, bist du transparent?". Und wenn es ist, gehe ich zum nächsten weiter. "Hey, was ist los mit dir? Transparent?". Bis ich das Ergebnis bekomme: "Nein! Ich bin total undurchsichtig!". Dann weiß ich: "Richtig! Hier fangen die Füße im PNG an! Das ist die Grenze!".

Dann mache ich das für jede Zeile und bekomme eine Art Pfadkoordinaten. Persönlich, ich brauche dies, um den perfekten Punkt für die Rotation achsis zu erkennen, wie ich es realistisch auf einem Boden wackeln lassen möchte. Ich kann nicht einfach die Rahmenbreite und die Ursprungsinformationen dafür verwenden. Es wäre nicht realistisch.

Also: Gibt es eine Möglichkeit, die Daten eines UIImage oder eines Bildes überhaupt zu untersuchen, um zu prüfen, ob ein Pixel transparent ist oder nicht?

+0

Ich bin auf der Suche nach der gleichen Sache, wie es für tiefere Kollisionserkennung nützlich wäre –

+0

In der Tat ist das für tiefe Kollisionserkennung wichtig. Ich weiß, dass Spieleentwickler genau das tun. – Thanks

Antwort

1

Sie können es einfacher finden, einen speicherinternen Kontext mit einem bekannten Format zu erstellen, dann das Bild in den Speicherkontext. Beachten Sie, dass der Zielkontext ein anderes Bitmap-Format und ein anderer Farbmodus als das ursprüngliche Bild sein kann, das zum leichteren Lesen vorgesehen ist.

Alternativ, wenn Sie ein Vielfraß für Strafe sind, können Sie die CGImage Eigenschaft des UIImage zu erhalten, dann die Core Graphics-Funktionen verwenden, um das Pixel-Format, um zu bestimmen, dann Code schreiben, um die Pixel-Format Daten zu dekodieren ...

Letzte Option, wenn Sie die verwendeten Bilder steuern: Erstellen Sie ein Maskenbild (1-Bit-Alpha) aus dem Bild, und verwenden Sie das, um zu bestimmen, wo sich die Kanten befinden. Sie können eine solche Maske einfach in einem Grafikeditor erstellen, oder Sie können es wahrscheinlich tun, indem Sie das Bild in einen 1-Bit-Speicherkontext zeichnen, wenn Sie die Zeichnungseigenschaften korrekt festlegen.

+0

Wie würde ich diesen In-Memory-Kontext mit einem bekannten Format erstellen? – Thanks

+0

Eigentlich hat Andys Antwort unten eine Verbindung zu einem ziemlich guten Beispiel. –

2

Es scheint keinen relativ einfachen Weg zu geben, dies mit UIImage zu tun. Stattdessen sehe ich zwei einfachere Optionen.

Wenn Sie die verwendeten Bilder steuern, können Sie im Idealfall die benötigten Daten vorab berechnen. Dann können Sie Bilder entweder so umformatieren, dass der Punkt, an dem Sie interessiert sind, in der Mitte des Bildes liegt (das Sie einfach clientseitig mit nur der Breite und Höhe berechnen können), oder die Koordinate mit dem Bild senden. Dies erspart dem Kunden die Neuberechnung für jedes Bild, was möglicherweise Ihre Anwendung beschleunigen und Batterielebensdauer sparen kann.

Alternativ können Bildbibliotheken wie libpng statisch in Ihr Programm kompiliert werden. Sie können das Bild laden, die Verarbeitung durchführen, es dann entladen und die Datei an UIImage übergeben. Nur die Funktionen, die Sie verwenden, werden verknüpft, sodass Sie möglicherweise vermeiden können, zu viel Bloat hinzuzufügen, da die Renderroutinen möglicherweise weggelassen werden. Dies hat den Nachteil, dass Ihre Software auf Bibliotheken von Drittanbietern angewiesen ist.

3

Ich fand this tutorial im Netz, wo Sie den UIColor (ARGB) -Wert jedes Pixels auf dem Bildschirm erhalten können. vielleicht, wenn Sie das ein bisschen zwicken, können Sie ihm ein UIImage übergeben und alle Werte erhalten, die Sie brauchen

+0

Das funktioniert, obwohl es eine Kopie des Bildes erstellt, um ein einzelnes Pixel daraus zu extrahieren. Offensichtlich würden Sie das für die Anwendung des ursprünglichen Posters zwischenspeichern. –

+0

Die Kopie wird erstellt, um eine Art "normalisierten" Grafikkontext zu erhalten. CG kümmert sich darum, den Kontext vom Bild in ein bestimmtes umzuwandeln. Dann können Sie über die Pixel iterieren. Nun, in der Theorie. In der Praxis hat es für das Alpha nicht funktioniert. Die Ergebnisse sind sehr unsicher. – Thanks

Verwandte Themen