Pregunta

Actualmente estoy haciendo un editor de imágenes básico para iPhone.

Me tomo la CGImageRef de un UIImage y crear un contexto para que mediante el siguiente código

origImage = result.CGImage;

Iheight = CGImageGetHeight(origImage);
Iwidth = CGImageGetWidth(origImage);
IcolorSpace = CGColorSpaceCreateDeviceRGB();
IrawData = malloc(Iheight * Iwidth * 4);
IbytesPerPixel = 4;
IbytesPerRow = IbytesPerPixel * Iwidth;
IbitsPerComponent = 8;
Icontext = CGBitmapContextCreate(IrawData, Iwidth, Iheight, IbitsPerComponent,
                                 IbytesPerRow, IcolorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
                                 );
//[bytesPerRow release];
CGContextSetBlendMode(Icontext, kCGBlendModeCopy);
CGContextDrawImage(Icontext, CGRectMake(0,0,Iwidth,Iheight),  origImage);

entonces bucle a través de los píxeles

for (int x=0; x<Iwidth; x++) {
    for (int y=0; y<Iheight; y++) {
            //and  set the alpha component to 0
            int byteIndex = (y*IbytesPerRow) + x*IbytesPerPixel;

            IrawData[byteIndex+3] = 0;

            }
}

y luego crear un CGImageRef del contexto con

    CGImageRef imagea = CGBitmapContextCreateImage(Icontext);

y agregue la CGImage a un UIImage y asignar a un UIImageView

El problema es que el cambio de alfa no está efectuando la imagen resultante

si cambio el color de los píxeles con

IrawData[byteIndex+(0/1/2)]

los cambios de color, pero Todavía no puedo cambiar el alfa del píxel

Gracias,

nonono

¿Fue útil?

Solución

No se olvide de Unpremultiply los colores antes de cambiar la alfa, y volver a ellos después premultiplicar.

Premultiplicado de color (a menudo llamado “alfa premultiplicado”, que se engañosa) significa que los componentes de color son ya almacenados multiplican por el alfa, a la facilidad de composición. La composición habitual (fuente-over) miradas operación como ésta:

result = (source.rgb * source.a) + (destination.rgb * (1.0 - destination.a));

medios premultiplicación que la primera multiplicación se ha hecho, por lo que se puede omitir:

result =  source.rgb             + (destination.rgb * (1.0 - destination.a));

Cuando se cambia el alfa sin cambiar los componentes de color premultiplicados, el resultado no cambia, cuando se dibuja la imagen, que se verá no es diferente, ya que los colores siguen premultiplicados por el viejo alfa.

Por lo tanto, es necesario Unpremultiply los colores, es decir, dividir cada una por la alfa (como anteriormente se multiplica, por lo que ahora debe hacer lo inverso) -antes de que cambie el alfa. Entonces, después de cambiar el alfa, premultiplicar los colores por el nuevo alfa.

Por supuesto, esto significa que cuando se cambia el alfa a cero, todos los colores se volverá negro (r = g = b = 0). Por lo tanto, asegúrese de mantener la imagen original si el usuario podría querer cambiarlo de nuevo.

Probablemente sería más efectiva, y sin duda sería más fácil, que acaba de dibujar la imagen original (sin ningún tipo alfa cambios realizados a la misma) a cualquier alfa que el usuario desee. Usted puede hacer esto mediante cambiar de su contexto de presentación alfa mundial antes de dibujar la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top