Quindi, per cambiare un bianco a trasparente possiamo usare questo metodo:
-(UIImage *)changeWhiteColorTransparent: (UIImage *)image {
CGImageRef rawImageRef=image.CGImage;
const float colorMasking[6] = {222, 255, 222, 255, 222, 255};
UIGraphicsBeginImageContext(image.size);
CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
{
//if in iphone
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height);
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
}
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef);
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
CGImageRelease(maskedImageRef);
UIGraphicsEndImageContext();
return result;
}
e per sostituire i pixel non trasparenti con il nero, possiamo usare:
- (UIImage *) changeColor: (UIImage *)image {
UIGraphicsBeginImageContext(image.size);
CGRect contextRect;
contextRect.origin.x = 0.0f;
contextRect.origin.y = 0.0f;
contextRect.size = [image size];
// Retrieve source image and begin image context
CGSize itemImageSize = [image size];
CGPoint itemImagePosition;
itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width)/2);
itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height));
UIGraphicsBeginImageContext(contextRect.size);
CGContextRef c = UIGraphicsGetCurrentContext();
// Setup shadow
// Setup transparency layer and clip to mask
CGContextBeginTransparencyLayer(c, NULL);
CGContextScaleCTM(c, 1.0, -1.0);
CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [image CGImage]);
CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
contextRect.size.height = -contextRect.size.height;
contextRect.size.height -= 15;
// Fill and end the transparency layer
CGContextFillRect(c, contextRect);
CGContextEndTransparencyLayer(c);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
quindi in pratica questo sarebbe:
Ovviamente lo chiamereste in un thread in background, per mantenere tutto in esecuzione senza problemi.
fonte
2013-01-27 22:56:15
Dov'è @ [Brad Larson] (http://stackoverflow.com/users/19679/brad-larson) quando hai bisogno di lui! –
Provare a creare un filtro personalizzato basato su GPUImageAlphaBlendFilter, sostituendo solo il canale alfa ('textureColor.a') nell'ultima operazione di mix con il canale rosso (' textureColor.r'). Se hai convertito l'immagine in luminanza prima di alimentarla, credo che debba fondersi in modo selettivo sulla luminanza della prima immagine. Potrebbe essere necessario modificare l'ordine del mix per ottenere l'effetto desiderato. –
Grazie mille per il tuo tempo! Sfortunatamente, l'app si sta bloccando ora. Per essere chiari, questa è la linea a cui ti riferisci: gl_FragColor = vec4 (mix (textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); Come posso passare solo in rosso? Tutto ciò che ho provato è finito in un crash: Errore di asserzione in - [GPUImageAlphaBlendFilter initWithVertexShaderFromString: fragmentShaderFromString:] –