Masque blanc sur l'image PNG sur iPhone
Question
Je sais qu'il ya déjà 2 messages pertinents à ce sujet, mais on ne sait pas ...
Ainsi, le cas est ce ...:
J'ai un UIImage
qui se compose d'un fichier png
demandé à partir d'une URL sur le net.
Est-il possible de masquer la couleur blanche il devient transparent?
Tout ce que je l'ai essayé jusqu'à présent avec CGImageCreateWithMaskingColors
, retourne une image blanche ...
Toute aide les gars seraient précieux:)
La solution
Ok depuis que je trouve une solution et il fonctionne très bien, je réponds à ma question et je crois vraiment que ce sera utile à de nombreuses personnes ayant le même besoin.
Tout d'abord je pensais que ce serait bien d'étendre mon UIImages
par catégorie:
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
Enfin, je suis en mesure de l'utiliser comme ceci: (Après avoir importé UIImage+Utils.h
bien sûr)
UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!
Autres conseils
Il est pas vraiment possible, au moins aucun moyen facile, certainement pas appel API. Il est essentiellement un problème de retouche d'image fait généralement avec Photoshop. La plupart des images qui ont un fond transparent ont été créés de cette façon.