¿Cómo combinar una image con una máscara en un solo UIImage con Accelerate Framework?

Este código combina una image y una image de máscara de escala de grises en un UIImage. Funciona pero es lento.

+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *) mask { CGImageRef imageReference = image.CGImage; CGImageRef maskReference = mask.CGImage; CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), CGImageGetHeight(maskReference), CGImageGetBitsPerComponent(maskReference), CGImageGetBitsPerPixel(maskReference), CGImageGetBytesPerRow(maskReference), CGImageGetDataProvider(maskReference), NULL, // Decode is null YES // Should interpolate ); CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); CGImageRelease(imageMask); UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; CGImageRelease(maskedReference); return maskedImage; } 

Creo que Accelerate Framework puede ayudar. Pero no estoy seguro. Hay vImage y puede hacer la composition alfa . O tal vez lo que busco se llama " vImage Transform ". No como CATransform3D pero "transformando" la image.

Pero lo que necesito es hacer una foto en un JPEG transparente basado en una máscara.

¿Se puede usar Accelerate Framework para esto? ¿O hay una alternativa?

VImageOverwriteChannels_ARGB8888 es probablemente la API que desee, siempre que la image JPEG sea opaca para comenzar. Puede utilizar vImageBuffer_InitWithCGImage para extraer la image fuente como 8 bpc, 32 bpp, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little. Esto le dará una image BGRA8888 con alfa opaca. Saque la máscara como una image 8bpc, 8bpp, kCGImageAlphaNone. Use vImageOverwriteChannels_ARGB8888 para sobrescribir el BGRA alpha con el nuevo canal alfa. Luego crea una nueva image CG con vImageCreateCGImageFromBuffer, modificando ligeramente el formatting a kCGImageAlphaFirst | kCGBitmapByteOrder32Little.

También puede intentar aplanar la máscara en la image tomando la reference enmascarada arriba y descodificándola directamente a BGRA kCGImageAlphaFirst. Esto solo funciona bien si la image y la máscara son del mismo tamaño. De lo contrario, se produce un nuevo muestreo, lo que lleva mucho time.

No sé si cualquiera de estos será realmente más rápido o no. Sería útil mirar un perfil de time de instrumentos de dónde va tu time. vImageOverwriteChannels_ARGB8888 es probablemente solo un pequeño trabajo que hay que hacer aquí. Dependiendo del formatting de la image original, se puede realizar mucho trabajo para la conversión del espacio de color y la conversión de formatting de image detrás de escena en vImageBuffer_InitWithCGImage y vImageCreateCGImageFromBuffer. La key para acelerar aquí (y con la ruta CG de la competencia) es minimizar la carga de trabajo al tomar decisiones inteligentes.

A veces, probando algunas cosas, luego archivando un error en contra de la manzana si nada funciona bien puede dar una respuesta informada. Un ejemplo trivialmente reproducible suele ser key.