Also, einen weißer transparent ändern wir diese Methode verwenden können:
-(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;
}
und den nicht transparenten Pixel mit schwarz zu ersetzen, können wir verwenden:
- (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;
}
so in der Praxis dieser wäre:
-(UIImage *)silhouetteForImage:(UIImage *)img {
return [self changeColour:[self changeWhiteColorTransparent:img]];
}
Offensichtlich würden Sie dies in einem Hintergrundthread nennen, um alles runnin zu halten g reibungslos.
Wo ist @ [Brad Larson] (http://Stackoverflow.com/users/19679/brad-larson), wenn Sie ihn brauchen! –
Versuchen Sie, einen benutzerdefinierten Filter zu erstellen, der auf dem GPUImageAlphaBlendFilter basiert und nur den Alphakanal ('textureColor.a') in der letzten Mischoperation durch den roten Kanal ersetzt (' textureColor.r'). Wenn Sie Ihr Bild in Luminanz umgewandelt haben, bevor Sie es in dieses Bild einfügen, sollte es meiner Ansicht nach selektiv auf der Leuchtdichte des ersten Bildes basieren. Möglicherweise müssen Sie die Mischreihenfolge optimieren, um den gewünschten Effekt zu erzielen. –
Vielen Dank für Ihre Zeit! Leider stürzt die App jetzt ab. Um klar zu sein, ist dies die Zeile, auf die Sie sich beziehen: gl_FragColor = vec4 (mix (textureColor.rgb, textureColor2.rgb, textureColor2.a * mischungPercent), textureColor.a); Wie gebe ich nur rot? Alles, was ich versuchte, endete mit einem Absturz: Assertionsfehler in - [GPUImageAlphaBlendFilter initWithVertexShaderFromString: fragmentShaderFromString:] –