Wie konvertieren von UIImage/CGImageRef der alpha-Kanal-Maske?
Wie kann ich extrahieren Sie den alpha-Kanal eines UIImage oder CGImageRef und wandeln es in eine Maske, die ich nutzen kann mit CGImageMaskCreate?
Beispiel:
Im wesentlichen gegeben, Bild, I don ' T care über die Farben im Bild. Alles was ich will ist, erstellen Sie ein Graustufen-Bild für den Alphakanal. Dieses Bild kann dann verwendet werden, um die Maske anderen Bilder.
Ein Beispiel für dieses Verhalten ist in der UIBarButtonItem, wenn Sie es liefern ein symbolbild. Nach den Apple-docs heißt es:
Werden die Bilder angezeigt, auf der die bar leiten sich aus diesem Bild. Wenn dieses Bild ist zu groß, um auf der bar, ist es passend skaliert. In der Regel, die Größe der Symbolleiste und der Navigationsleiste Bild ist 20 x 20 Punkte. Die alpha-Werten im Quellbild verwendet werden, um die Bilder zu erstellen—blickdicht-Werte werden ignoriert.
Den UIBarButtonItem nimmt ein beliebiges Bild und betrachtet nur die alpha, nicht die Farben des Bildes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Farbe Symbole den Weg, den bar-button-items zu tun, die Sie nicht wollen, dass die traditionelle Maske, die Sie wollen, dass die inverse einer Maske-einer, wo die deckende Pixel in dem ursprünglichen Bild, nehmen Sie Ihre endgültige Färbung, anstatt die andere Weise herum.
Hier ist ein Weg, dies zu erreichen. Nehmen Sie Ihre original-RBGA Bild und verarbeiten es, indem Sie:
E. g.
Nun können Sie
finalMaskImage
als Maske inCGContextClipToMask
etc, etc.Die Lösung von Ben Zotto ist richtig, aber es ist ein Weg, dies zu tun mit kein Mathe oder lokalen Komplexität, indem Sie sich auf
CGImage
zu tun, die für uns arbeiten.Folgende Lösung verwendet Swift (v3) zum erstellen einer Maske aus einem Bild durch umkehren der alpha-Kanal von einem bereits vorhandenen Bild. Transparente Pixel in der Quelle Bild wird Opak und teilweise transparente Pixel werden invertiert werden proportional mehr oder weniger transparent.
Die einzige Voraussetzung für diese Lösung ist ein
CGImage
Basis-image. Man kann entnommen werdenUIImage.cgImage
für die meistenUIImage
s. Wenn Sie das Rendern von dem Basis-image selbst in einemCGContext
verwendenCGContext.makeImage()
zum generieren eines neuenCGImage
.Den code
Das ist es! Die
mask
CGImage ist nun bereit, verwendet mitcontext.clip(to: rect, mask: mask!)
.Demo
Hier ist mein Basis-image mit "Masken-Bild" Opak-rot auf transparentem hintergrund:
Zeigen, was passiert, wenn dieses durch die oben genannten Algorithmus, hier ist ein Beispiel, das einfach macht, das resultierende Bild über einen grünen hintergrund.
Nun können wir das Bild maskiert wiedergegebenen Inhalt. Hier ist ein Beispiel, wo wir Rendern ein maskierter Farbverlauf auf der grünen aus dem vorigen Beispiel.
(Hinweis: Sie können auch die swap -
CGImage
code Beschleunigen FrameworkvImage
möglicherweise profitieren von der Vektor-Bearbeitung von Optimierungen in der Bibliothek. Ich habe es nicht versucht.)Habe ich versucht, den code von quixoto, aber es funktionierte nicht für mich, damit ich ihn ein bisschen verändert.
War das problem, dass die Zeichnung nur den alpha-Kanal war nicht für mich arbeiten, also hab ich das manuell, indem Sie zunächst die Beschaffung der Daten von der original-Bild und die Arbeit am alpha-Kanal.
Können Sie rufen Sie die Funktion wie diese