Máscara de color blanco a cabo imagen PNG en el iPhone de
Pregunta
Sé que ya hay 2 mensajes pertinentes sobre eso, pero no está claro ...
Así que el caso es este ...:
Tengo un UIImage
que consiste en un archivo png
solicitada desde una dirección URL en la red.
¿Es posible enmascarar el color blanco por lo que se vuelve transparente?
Todo lo que he probado hasta ahora con CGImageCreateWithMaskingColors
, devuelve una imagen en blanco ...
Cualquier ayuda chicos serían preciosa:)
Solución
Ok, ya he encontrado una solución y está funcionando muy bien, estoy respondiendo a mi pregunta y realmente creo que esto será útil para muchas personas que tienen la misma necesidad.
En primer lugar pensé que sería bueno extender mi UIImages
a través de una categoría:
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
Por último, soy capaz de utilizar de esta manera: (Después de haber importado UIImage+Utils.h
por supuesto)
UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!
Otros consejos
En realidad no es posible, al menos hay una manera fácil, sin duda ninguna llamada a la API. Se trata básicamente de un problema de edición de imágenes por lo general hecho con Photoshop. La mayoría de las imágenes que tienen un fondo transparente fueron creados de esa manera.