Así, para cambiar un blanco a transparente podemos utilizar este método:
-(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;
}
y para reemplazar los píxeles no transparentes con negro, podemos utilizar:
- (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;
}
por lo que en la práctica esto Sería:
-(UIImage *)silhouetteForImage:(UIImage *)img {
return [self changeColour:[self changeWhiteColorTransparent:img]];
}
Obviamente, usted llamaría esto en un hilo de fondo, para mantener todo runnin g sin problemas.
¿Dónde está @ [Brad Larson] (http://stackoverflow.com/users/19679/brad-larson) cuando lo necesites! –
Intente crear un filtro personalizado basado en GPUImageAlphaBlendFilter, solo reemplazando el canal alfa ('textureColor.a') en la última operación de mezcla con el canal rojo (' textureColor.r'). Si ha convertido su imagen en luminancia antes de alimentar esto, creo que debería combinarse de manera selectiva según la luminancia de la primera imagen. Es posible que deba ajustar el orden de mezcla para lograr el efecto que desee también. –
¡Muchas gracias por su tiempo! Lamentablemente, la aplicación se está bloqueando ahora. Para que quede claro, esta es la línea a la que se refiere: gl_FragColor = vec4 (mix (textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a); ¿Cómo solo paso en rojo? Todo lo que probé terminó con un bloqueo: Fallo de aserción en - [GPUImageAlphaBlendFilter initWithVertexShaderFromString: fragmentShaderFromString:] –