2011-11-29 19 views
9

¿Cómo puedo borrar la parte magenta de un UIImage y hacerla transparente?Color iOS a transparente en UIImage

He revisado numerosas respuestas y enlaces en SO y nada funciona (por ejemplo, How to make one color transparent on a UIImage? respuesta 1 quita todo menos rojo, la respuesta 2 aparentemente no funciona debido a Why is CGImageCreateWithMaskingColors() returning nil in this case?).

Actualización:

Si uso CGImageCreateWithMaskingColors con el UIImage consigo un valor nulo. Si elimino el canal alfa (represento la imagen como JPEG y la vuelvo a leer) CGImageCreateWithMaskingColors devuelve una imagen pintada con un fondo negro.

Update2, el código:

Volviendo nil:

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 
CGImageRef imageRef = CGImageCreateWithMaskingColors(anchorWithMask.CGImage, colorMasking); 

NSLog(@"image ref %@", imageRef); 
// this is going to return a nil imgref. 

UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Volviendo una imagen con el fondo negro (que es normal ya que no hay canal alfa):

UIImage *inputImage = [UIImage imageWithData:UIImageJPEGRepresentation(anchorWithMask, 1.0)]; 

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 
CGImageRef imageRef = CGImageCreateWithMaskingColors(inputImage.CGImage, colorMasking); 

NSLog(@"image ref %@", imageRef); 
// imgref is NOT nil. 

UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Update3:

Lo conseguí trabajando agregando el canal alfa después del proceso de enmascaramiento.

+2

publicar su código. –

+2

Agregó el código. –

Respuesta

4
UIImage *image = [UIImage imageNamed:@"image.png"]; 

const float colorMasking[6] = {1.0, 1.0, 0.0, 0.0, 1.0, 1.0}; 
image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(image.CGImage, colorMasking)]; 

Recibes nada, porque los parámetros que envías no son válidos. Si abre la documentación de Apple, podrás ver esto:

Componentes
Una serie de componentes de color que especifican un color o una gama de colores para enmascarar la imagen con. La matriz debe contener 2N valores {min [1], max [1], ... min [N], max [N]} donde N es el número de componentes en el espacio de color de la imagen. Cada valor en los componentes debe ser un valor de muestra de imagen válida . Si la imagen tiene componentes de píxel entero, entonces cada valor debe estar en el rango [0 .. 2 ** bitsPerComponente - 1] (donde bitsPerComponente es el número de bits/componente de la imagen). Si la imagen tiene componentes de píxeles en coma flotante, cada valor puede ser cualquier número de coma flotante que sea un componente de color válido.

Puede abrir rápidamente la documentación manteniendo presionada la tecla Opción + Mouse Haga clic en alguna función o clase, como CGImageCreateWithMaskingColors.

+0

Acabo de probar esto y está devolviendo una uiimagen completamente transparente. –

+0

Así es como se ve la imagen de entrada: http://i.imgur.com/lxJdm.png (esta es la versión png, internamente es un UIImage de UIImagePicker) –

4

Hice esta función estática que elimina el fondo blanco se puede utilizar la sustitución de la máscara con la gama de colores que desea eliminar:

+ (UIImage*) processImage :(UIImage*) image 
{ 
    const float colorMasking[6]={222,255,222,255,222,255}; 
    CGImageRef imageRef = CGImageCreateWithMaskingColors(image.CGImage, colorMasking); 
    UIImage* imageB = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    return imageB; 
} 
+1

He votado esto antes de probarlo, no lo hace t trabajo. –

+0

Está trabajando en mi proyecto y estoy eliminando el rango de color blanco.Creo que especifica el rango de colores como en este que uso de 222 -> 255 para que el rojo se elimine. Puede que no lo entienda al 100%, pero podría volver a intentarlo con el rango que necesita. –

+0

@khaledannajar He utilizado este código, es perfecto pero todavía no puedo eliminar un pixcel blanco del borde de la línea en blanco que he dibujado programáticamente en mi aplicación – kb920

Cuestiones relacionadas