我有一个CALayer(containerLayer
),在将数据另存为平面文件之前,我希望将其转换为NSBitmapImageRep
。 containerLayer
的geometryFlipped
属性设置为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];
关于cocoa - 使用CALayer的renderInContext : method with geometryFlipped,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7856127/