Maschera colore bianco fuori un'immagine PNG su iPhone di
Domanda
So che ci sono già 2 posti rilevanti in merito, ma non è chiaro ...
Così il caso è questo ...:
Ho un UIImage
che consiste in un file png
richiesto da un URL in rete.
E 'possibile mascherare il colore bianco in modo che diventi trasparente?
Tutto ciò che ho provato finora con CGImageCreateWithMaskingColors
, restituisce un'immagine bianca ...
Qualsiasi aiuto ragazzi sarebbero preziosa:)
Soluzione
Ok da quando ho trovato una soluzione e sta funzionando benissimo, sto rispondendo alla mia domanda e io credo veramente che questo sarà utile a molte persone che hanno la stessa necessità.
Prima di tutto ho pensato che sarebbe bello per estendere il mio UIImages
tramite una categoria:
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
Infine, sono in grado di utilizzare in questo modo: (Dopo che ho importato UIImage+Utils.h
ovviamente)
UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!
Altri suggerimenti
Non è davvero possibile, almeno un modo facile, certamente nessuna chiamata API. Si tratta essenzialmente di un problema di modifica delle immagini di solito fatto con Photoshop. La maggior parte delle immagini che hanno uno sfondo trasparente sono stati creati in questo modo.