2013-02-15 13 views
19

Ich habe ein Bild mit einem gelben Vase im Vordergrund und transparenten Hintergrund:Put Ränder um teilweise transparentes Bild auf CGContext gezogen wird

enter image description here

ich es auf einem CGContext bin Zeichnung:

CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage); 

kann ich einen Schatten um sie ziehen durch die folgende Anweisung vor CGContextDrawImage mit:

CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor); 

enter image description here

Aber ich will um das Bild einen Schlaganfall setzen, so dass es dann sieht wie folgt aus:

enter image description here

Wenn ich dies tat:

CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f); 
CGContextSetLineWidth(shadowContext, 5); 
CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100)); 

Es (offensichtlich) zeichnet eine rechteckige Umrandung um die ganze Zeichnung wie folgt:

enter image description here

Was ist nicht was ich brauche.

Aber was ist der beste Weg, um die Grenze wie im dritten Bild zu zeichnen?

Bitte beachten Sie, dass es in diesem Fall nicht möglich ist, UIImageView zu verwenden, daher ist die Verwendung der Eigenschaften von CALayer von UIImageView nicht anwendbar.

+0

Rufen Sie 'CGContextSetShadowWithColor' vor dem Aufruf von' CGContextDrawImage' auf? – Ariel

+0

@elcanibal: Ja. Sonst würde es keinen Schatten geben. Ich bearbeite die ursprüngliche Frage, um das zu reflektieren. –

+0

Bitte posten Sie ein PNG der gelben Vase mit transparentem Hintergrund. Ihr erstes (schmuckloses) Bild hat einen grauen Hintergrund. –

Antwort

13

Eine Möglichkeit, dies zu tun, ist die mathematical morphology operator of dilation verwenden, um den Alpha-Kanal des Bildes nach außen "wachsen", dann das resultierende Graustufenbild als Maske zu verwenden, um einen Strich zu simulieren. Wenn Sie die erweiterte Maske füllen und dann das Hauptbild oben zeichnen, erhalten Sie den Effekt eines Strichs. Ich habe eine Demo erstellt, die diesen Effekt zeigt, verfügbar auf Github hier: https://github.com/warrenm/Morphology (alle Quellen sind mit MIT lizensiert, sollte es sich als nützlich erweisen).

Und hier ist ein Screenshot davon in Aktion:

enter image description here

Beachten Sie, dass diese staggeringly langsam ist (Dilatation erfordert Iteration eines Kerns über jedes Pixel), so dass Sie eine Strichbreite wählen sollte und precompute die maskiere das Bild für jedes deiner Quellbilder im Voraus.

+1

Ich frage mich, wie machbar es wäre, dies auf die Core Image Kernel Language zu portieren. Eine solche Implementierung könnte viel schneller als eine gerade Schleife mit C-Skalaroperationen sein. –

+0

Für eine Person mit etwas Erfahrung mit CI oder sogar GLSL wäre es ziemlich trivial. Es ist nur ein Minimierungsoperator über einer Nachbarschaft. Es ist jedoch mein Verständnis, dass Core Image nicht auf iOS-Geräten steckbar ist. Außerdem, wenn man clever wäre, könnte man wahrscheinlich eine Separierbarkeit oder eine Zerlegungseigenschaft des Kernels nutzen, um weniger Arbeit zu verrichten. – warrenm

+0

Dang, du hast Recht. Das habe ich vorher nicht bemerkt: CIKernel ist in iOS nicht vertreten (da es in den iOS-Dokumenten fehlt). –

0

Ich würde versuchen, entweder die Strichfarbe und Linienbreite vor Ihrem Anruf auf CGContextDrawImage, oder den Schatten (Opazität, Unschärfe, etc.) zu optimieren, so dass es wie ein Strich um das Bild aussieht. Lass es mich wissen, wenn das funktioniert!

+0

Das wird nicht funktionieren. Zwei Gründe: 1. Schatten simuliert einen Strich nicht genau. 2.Ich muss sowohl Strich als auch Schatten setzen. Also muss ich das Bild wirklich streichen können. –

+0

Sie können diese beiden Dinge festlegen, bevor Sie 'CGContextDrawImage' aufrufen, also zuvor' CGContextSetShadowWithColor', 'CGContextSetRGBStrokeColor' und' CGContextSetLineWidth' aufrufen. – Ariel

+1

@elcanibal: Aber was streichelst du? Du brauchst einen Pfad. –