2010-10-03 4 views
5

Ich habe thusly mein Bild ausgeblendet:CGImageCreateWithMask funktioniert gut, aber der ausgeblendete Bereich ist schwarz in meinem resultierenden Bild, wie kann ich es als weiß einstellen?

CGImageRef maskRef = [[UIImage imageNamed:@"testMask2.png"] CGImage]; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), nil, YES); 

UIImage *image = [UIImage imageWithContentsOfFile:path]; 

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 

imageView.image = [UIImage imageWithCGImage:masked]; 

Und es funktioniert gut, aber das resultierende Bild hat BLACK wo es ausgeblendet, wie kann ich es einstellen WHITE haben, wo seine ausgeblendet?

Antwort

9

Wenn Sie JPEG-Bilder maskieren, die keinen Alpha-Kanal haben, passiert dies (schwarzer Hintergrund statt transparent).

Sie müssen also so etwas wie dies tun, bevor Maskierung:

CGImageRef imageNoAlpha = [UIImage imageNamed:@"noAlphaImage.jpg"].CGImage; 

CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); 

CGFloat width = CGImageGetWidth(imageNoAlpha); 
CGFloat height = CGImageGetHeight(imageNoAlpha); 

CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst); 

CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha); 

CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha); 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 

...

Seien Sie sicher, erstellt Bilder veröffentlichen, Kontext und Farbraum ...

+1

Es gibt einen kleinen Tippfehler für die Höhe, es wird stattdessen die Breite –

+0

Dank @BahriOkuroglu ... korrigiert. –

0

Das Bild soll transparent sein, wo es "maskiert" ist; Die Farbe, die Sie sehen, hängt davon ab, auf welchem ​​Hintergrund Sie zeichnen.

(ich erinnere mich nicht, wenn es eine Anforderung ist, dass das Quellbild einen Alphakanal hat.)

Es kann dafür sorgen, dass imageView.opaque = NO wert sein.

+0

Ich setze den Alpha des ImageView-Hintergrunds auf 0 und undurchsichtig für NO, aber immer noch schwarz, ich frage mich, ob die Schwärze auf der CGImage-Ebene ist, wie ich es in einen Kontext zeichnen muss. – Shizam

+0

Shizam: die "Schwärze" ist was auch immer unter der Bildansicht ist. oder wenn es transparent ist, was auch immer darunter steht. Es sind Schildkröten den ganzen Weg hinunter! – rpetrich

+0

Nein, als Test habe ich png mit Transparenz erstellt und es in das ImageView eingefügt und es zeigte sich bis zur Hintergrundfarbe (blau), aber wenn ich das resultierende maskierte Bild hineinlege ist es immer noch schwarz. Ich habe eine längere Operation ausgeführt, um einen BitmapContext zu erstellen, und das Bild in das Bild zu zeichnen, und DANN den resultierenden Kontext als Quelle für ein Bild zu verwenden, bei dem das Alpha korrekt durchgebrochen wurde. Seltsam. – Shizam

0

Try this:

imageView.opaque = NO; 
imageView.backgroundColor = [UIColor clearColor];

Auch das Bild verwendet wird, sollte schwarz und weiß (nicht transparent) zu maskieren sein.

0

Ich kämpfte mit das gleiche Problem. Die Lösung ist recht einfach: es das Beste ist für die Maskierung auf diese Weise grafischen Kontext zu schaffen:

UIGraphicsBeginImageContextWithOptions(maskFrame.size, NO, 0.0); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGRect ff = CGRectMake(0, 0, maskFrame.size.width, mask.size.height); 
CGContextClipToMask(ctx, ff, mask.CGImage); 
.... 

Stellen Sie sicher, der zweite Parameter in UIGraphicsBeginImageContextWithOptions wird auf NO (was bedeutet, keine opaken Kontext). Ein weiterer Vorteil ist, dass diese Erstellungsfunktion den Kontext automatisch auf Retina-Displays skaliert.

Verwandte Themen