2014-02-27 8 views
16

Ich möchte bestimmte Farbe auf bestimmten Bereich eines Bildes füllen.Füllfarbe auf bestimmten Bildbereich?

EX:

enter image description here

In oben Joker Bild, Wenn Berührung auf Haar von Joker dann bestimmte Farbe auf der Nase auf das Haar Oder berühren füllen dann bestimmte Farbe auf die Nase füllen .. usw. Ich hoffe, du verstehst, was ich zu sagen versuche.

Nach googeln es sein kann durch die Verwendung von UIBezierPath oder CGContext Reference erreichen, aber ich bin sehr neu für sie, habe ich versucht, diese Dokumentation zu lesen, aber ich verstehe nicht (mehr Zeit nehmen) alles auch habe ich Grenze Zeit für dieses Projekt. Also kann ich nicht mehr Zeit damit verbringen.

Auch ich fand, dass wir Flood fill algorithm. verwenden können, aber ich weiß nicht, wie man in meinem Fall verwendet.

HINWEIS: Ich mag nicht Originalbild teilen (so wie Haare Nase, Kappe, ... usw.) weil Wenn ich dann so so viele Bilder in Bündel wird es tun Ich muss es sowohl für das normale als auch für das Retina-Gerät handhaben, daher ist diese Option nicht hilfreich für mich.

Also bitte mir Ihren wertvollen Vorschlag geben und mir auch sagen, was für mich am besten ist UIBezierPath oder CGContext Reference? Wie kann ich Farbe auf einen bestimmten Teil des Bildes füllen? und/oder können wir Farbe unter dem schwarzen Rand der Fläche füllen? Weil ich neu bei Quartz 2D Programming bin.

+0

Eine Möglichkeit, dies mit dem Beizerpath zu tun. Ein anderes durch Bildmaskierung. Ich vermute. – Exploring

+0

Hallo ich Gesicht ein Problem mit Flut füllen Bibliothek .. wenn ich auf Grenze, die Grenzfarbe zu füllen berühren .. und wie man Grenze Grenze Farbe zu stoppen ..? –

+0

Hallo, ich habe diesen Code für mein Bild ausprobiert, aber manchmal erkennt es den tatsächlichen Punkt nicht und füllt die Farbe irgendwo anders. Kann also jemand den generischen Algorithmus zum Ausfüllen von Farben auf uiimage bereitstellen? – Jane

Antwort

8

Verwenden Sie die Github-Bibliothek unten. Die Post nutzt die Flußfüllen Algorithmus: UIImageScanlineFloodfill

Objective C Beschreibung: ObjFloodFill

Wenn Sie detaillierte Erklärung des Algorithmus aussehen soll: Recursion Explained with the Flood Fill Algorithm (and Zombies and Cats)

einige der anderen Tutorials in anderen Sprachen: Lode's Computer Graphics Tutorial : Flood Fill

+0

+1 Für die Verbindungen. _Recursion Explained mit Zombies and Cats_ ist visuell und konzeptionell ein sehr guter Artikel. –

3

Anstatt zu versuchen, einen Bereich eines rasterbasierten Bilds überfluten zu lassen, wäre ein besserer Ansatz (und eine viel kleinere Menge an Daten) die Erstellung von Vektorbildern. Sobald Sie ein Vektorbild haben, können Sie den Umriss streichen, um es ungefärbt zu zeichnen, oder Sie können den Umriss ausfüllen, um es farbig zu zeichnen.

Ich empfehle die Verwendung von CoreGraphics Anrufe wie CGContextStrokePath() und CGContextFillPath(), um die Zeichnung zu tun. Das wird wahrscheinlich besser aussehen, als wenn Sie die Flood-Füllung verwenden, da Sie schöne Kanten mit Anti-Aliasing erhalten.

Apple hat einige good documentation zum Zeichnen mit Quartz 2D. Besonders die section on Paths ist nützlich, was Sie versuchen zu tun.

+0

Dies ist eine gute Option für den Anfang, aber gibt es eine Demo oder einen Ausgangspunkt für das Erstellen der Raster-basierten Bilder und auch, wie Sie die Berührungspunkte auf dem Bild erhalten und den Bereich definieren? Hilfst du mir ein wenig [@ user1118321] (http://stackoverflow.com/users/1118321/user1118321) –

+0

@TheLion Ich glaube [dieser Beispielcode] (https://developer.apple.com/library/ Mac/Samplecode/Quartz2DShading/Einführung/Intro.html) zeigt einige grundlegende Beispiele, wie es geht. – user1118321

2

können Sie das Kontext Transparenz basierend auf Bild Alpha Clip

ich eine schnelle Bild mit schwarzer Farbe und Alpha erstellt haben

enter image description here

Dann

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); // Get the context 
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); // Set the fill color to be blue 

    // Flip the context so that the image is not flipped 
    CGContextTranslateCTM(context, 0, rect.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // Clip the context by a mask created from the image 
    UIImage *image = [UIImage imageNamed:@"image.png"]; 
    CGImageRef cgImage = image.CGImage; 
    CGContextClipToMask(context, rect, cgImage); 

    // Finally fill the context with the color and mask you set earlier 
    CGContextFillRect(context, rect); 
} 
den Code unten verwenden

Das Ergebnis

enter image description here

Dies ist ein kurzer Hinweis darauf, was Sie tun können. Allerdings müssen Sie jetzt Ihr Bild konvertieren alpha transparent auf die Teile hinzufügen Sie

Nach kurzer Suche ich diese Links gefunden

How can I change the color 'white' from a UIImage to transparent

How to make one colour transparent in UIImage

1

Wenn Sie entfernen müssen erstellen Ihr Bild als SVG-Vektor-Basisbild, wird es sehr leicht sein (weniger als png, jpg) und sehr einfach über Quartz 2D mit Bezier-Pfade zu verwalten. Bezier-Pfade können gefüllt werden (weiß beim Start). UIBezierPath verfügt über eine Methode (containsPoint :), die hilft zu definieren, wenn Sie in das Feld klicken.

Verwandte Themen