Warum wird mein Bild Maske mein Bild schwarz machen, wo die Maske weiß ist?
Frage
Ich habe ein 300 x 400 Pixel PNG-24 mit Alpha-Kanal. Es geht um 140kb. Ich möchte ein paar Teile davon maskieren, so dass ich erstellt eine weitere 300 x 400 Bild als PNG-24, aber mit nur schwarz, grau und weiß und kein Alpha-Kanal.
Das Seltsame ist: Wo die Maske schwarz ist, wird das Bild nur gehalten Original. Keine Transparenz. Aber wo die Maske weiß ist, wird das Bild schwarz nur schwarz. Keine Transparenz.
Es funktioniert teilweise auf sehr kleine Bilder wie 50 x 50 Pixel. Jede Idee, was mit dieser Funktion falsch sein kann?
+ (UIImage*)maskImage:(UIImage*)image withMask:(UIImage*)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef),
NULL, false);
CGImageRef theImage = image.CGImage;
CGImageRef masked = CGImageCreateWithMask(theImage, mask);
return [UIImage imageWithCGImage:masked];
}
Mein Hintergrund ist orange, so dass diese Farbe durchscheinen soll. Die UIImageView, die das Bild hält, wird auf Clear / Transparenz und opaken = NO.
Lösung
Ich denke, Ihr Code von hier . Es gibt diesen Kommentar:
Ich habe den Code verbessert, so dass es richtig maskieren Bilder, die nicht über ein Alphakanal.
Also, wenn es nicht für Sie arbeiten, vielleicht Ihr Bild nicht über einen Alpha-Kanal.
Andere Tipps
Seien Sie vorsichtig - dass Code-Lecks! Ich merkte es erst diese Methode in einer Schleife ausgeführt wird. Stellen Sie sicher, CGImageRelease(mask)
und CGImageRelease(masked)
aufrufen, bevor das Bild zurück.
- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask(image.CGImage, mask);
UIImage *img = [UIImage imageWithCGImage:masked];
//otherwise we will leak
CGImageRelease(mask);
CGImageRelease(masked);
return img;
}