Maske weiße Farbe aus PNG-Bild auf dem iPhone
Frage
Ich weiß, dass es bereits zwei relevante Beiträge über das, aber es ist nicht klar, ...
So der Fall ist dies ...:
Ich habe eine UIImage
, die aus einer png
Datei von einer URL im Netz angefordert besteht.
Ist es möglich, die weiße Farbe zu maskieren, damit es transparent wird?
Alles, was ich bisher versucht, mit CGImageCreateWithMaskingColors
, gibt ein weißes Bild ...
Jede Hilfe Jungs wären wertvoll:)
Lösung
Ok, da ich eine Lösung gefunden, und es funktioniert gut, ich meine Frage zu beantworten bin, und ich glaube wirklich, dass das viele Menschen von Nutzen sein wird, um das gleiche Bedürfnis haben.
Vor allem dachte ich, das wäre schön meine UIImages
über eine Kategorie zu erweitern:
UIImage + Utils.h
#import <UIKit/UIKit.h>
@interface UIImage (Utils)
- (UIImage*)imageByClearingWhitePixels;
@end
UIImage + Utils.m
#import "UIImage+Utils.h"
@implementation UIImage (Utils)
#pragma mark Private Methods
- (CGImageRef) CopyImageAndAddAlphaChannel:(CGImageRef) sourceImage {
CGImageRef retVal = NULL;
size_t width = CGImageGetWidth(sourceImage);
size_t height = CGImageGetHeight(sourceImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);
if (offscreenContext != NULL) {
CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);
retVal = CGBitmapContextCreateImage(offscreenContext);
CGContextRelease(offscreenContext);
}
CGColorSpaceRelease(colorSpace);
return retVal;
}
- (UIImage *) getMaskedArtworkFromPicture:(UIImage *)image withMask:(UIImage *)mask{
UIImage *maskedImage;
CGImageRef imageRef = [self CopyImageAndAddAlphaChannel:image.CGImage];
CGImageRef maskRef = mask.CGImage;
CGImageRef maskToApply = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef), NULL, NO);
CGImageRef masked = CGImageCreateWithMask(imageRef, maskToApply);
maskedImage = [UIImage imageWithCGImage:masked];
CGImageRelease(imageRef);
CGImageRelease(maskToApply);
CGImageRelease(masked);
return maskedImage;
}
#pragma mark Public Methods
- (UIImage*)imageByClearingWhitePixels{
//Copy image bitmaps
float originalWidth = self.size.width;
float originalHeight = self.size.height;
CGSize newSize;
newSize = CGSizeMake(originalWidth, originalHeight);
UIGraphicsBeginImageContext( newSize );
[self drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Clear white color by masking with self
newImage = [self getMaskedArtworkFromPicture:newImage withMask:newImage];
return newImage;
}
@end
Schließlich, kann ich es wie folgt zu verwenden: (Nachdem ich UIImage+Utils.h
natürlich importiert)
UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!
Andere Tipps
Es ist nicht wirklich möglich, zumindest keine einfache Möglichkeit, schon gar kein API-Aufruf. Es ist im Grunde ein Bildbearbeitungs Problem in der Regel mit Photoshop. Die meisten Bilder, die einen transparenten Hintergrund haben wurden auf diese Weise erstellt.