Cocoa 使用CALayer';s renderInContext:带有GeometryLipped的方法

Cocoa 使用CALayer';s renderInContext:带有GeometryLipped的方法,cocoa,core-graphics,calayer,nsbitmapimagerep,Cocoa,Core Graphics,Calayer,Nsbitmapimagerep,我有一个CALayer(containerLayer),我希望在将数据保存为平面文件之前将其转换为NSBitmapImageRepcontainerLayer将其GeometryLipped属性设置为YES,这似乎导致了问题。最终生成的PNG文件正确呈现内容,但似乎没有考虑翻转的几何体。我显然在寻找test.png来准确地表示左侧显示的内容 下面是我正在处理的问题和代码的截图 - (NSBitmapImageRep *)exportToImageRep { CGContextRef co

我有一个CALayer(
containerLayer
),我希望在将数据保存为平面文件之前将其转换为
NSBitmapImageRep
containerLayer
将其
GeometryLipped
属性设置为YES,这似乎导致了问题。最终生成的PNG文件正确呈现内容,但似乎没有考虑翻转的几何体。我显然在寻找test.png来准确地表示左侧显示的内容

下面是我正在处理的问题和代码的截图

- (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;    
}

以下是实际保存生成的
NSBitmapImageRep
的代码,仅供参考:

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

在渲染到目标上下文之前,需要翻转目标上下文

用此更新您的代码,我刚刚解决了相同的问题:

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