2011-10-21 11 views
7

Tengo un CALayer (containerLayer) que quiero convertir a un NSBitmapImageRep antes de guardar los datos como un archivo plano. containerLayer tiene su propiedad geometryFlipped establecida en SÍ, y esto parece estar causando problemas. El archivo PNG que finalmente se genera representa el contenido correctamente, pero no parece tener en cuenta la geometría volteada. Obviamente estoy buscando test.png para representar con precisión el contenido que se muestra a la izquierda.Usando el método renderInContext de CALayer: con geometryFlipped

A continuación se muestra una captura de pantalla del problema y el código con el que estoy trabajando.

A visual example

- (NSBitmapImageRep *)exportToImageRep 
{ 
    CGContextRef context = NULL; 
    CGColorSpaceRef colorSpace; 
    int bitmapByteCount; 
    int bitmapBytesPerRow; 

    int pixelsHigh = (int)[[self containerLayer] bounds].size.height; 
    int pixelsWide = (int)[[self containerLayer] bounds].size.width; 

    bitmapBytesPerRow = (pixelsWide * 4); 
    bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); 

    colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
    context = CGBitmapContextCreate (NULL, 
            pixelsWide, 
            pixelsHigh, 
            8, 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaPremultipliedLast); 
    if (context == NULL) 
    { 
     NSLog(@"Failed to create context."); 
     return nil; 
    } 

    CGColorSpaceRelease(colorSpace); 
    [[[self containerLayer] presentationLayer] renderInContext:context];  

    CGImageRef img = CGBitmapContextCreateImage(context); 
    NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:img]; 
    CFRelease(img); 

    return bitmap;  
} 

Para referencia, aquí está el código que realmente salva la NSBitmapImageRep generada:

NSData *imageData = [imageRep representationUsingType:NSPNGFileType properties:nil]; 
[imageData writeToFile:@"test.png" atomically:NO]; 

Respuesta

6

tendrá que girar el contexto de destino ANTES rindes en ella.

actualización de su código con esto, acabo de resolver el mismo problema:

CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, pixelsHigh); 
CGContextConcatCTM(context, flipVertical); 
[[[self containerLayer] presentationLayer] renderInContext:context]; 
Cuestiones relacionadas