我正在使用以下代码从屏幕获取UIImage:
CGSize s = [self getSize];
int tx = s.width;
int ty = s.height;
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerPixel = (bitsPerComponent * 4)/8;
int bytesPerRow = bytesPerPixel * tx;
NSInteger myDataLength = bytesPerRow * ty;
NSMutableData *buffer = [[NSMutableData alloc] initWithCapacity:myDataLength];
NSMutableData *pixels = [[NSMutableData alloc] initWithCapacity:myDataLength];
if( ! (buffer && pixels) ) {
[buffer release];
[pixels release];
return nil;
}
glReadPixels(0,0,tx,ty,GL_RGBA,GL_UNSIGNED_BYTE, [buffer mutableBytes]);
// make data provider with data.
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, [buffer mutableBytes], myDataLength, NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGImageRef iref = CGImageCreate(tx, ty,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpaceRef, bitmapInfo, provider,
NULL, false,
kCGRenderingIntentDefault);
CGContextRef context = CGBitmapContextCreate([pixels mutableBytes], tx,
ty, CGImageGetBitsPerComponent(iref),
CGImageGetBytesPerRow(iref), CGImageGetColorSpace(iref),
bitmapInfo);
CGContextTranslateCTM(context, 0.0f, ty);
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, tx, ty), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(context);
UIImage* image = [[UIImage alloc] initWithCGImage:outputRef];
CGImageRelease(iref);
CGContextRelease(context);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
CGImageRelease(outputRef);
[pixels release];
[buffer release];
return [image autorelease];
我得到的是一个图像,每当应该有透明度(在opengl中)时,只有颜色(255,255,255,226)。我该如何解决这个问题?
答案 0 :(得分:1)
CGContextDrawImage
不只是复制数据,而是将源图像绘制到目标图像上。所以在这一点上,它将使用你的alpha通道作为alpha通道作为alpha通道,而不仅仅是将其复制过来。
说实话,如果您实际上不想修改从OpenGL返回的数据,我对context
和image
的意见有点困惑。我建议你切入:
CGImageRef iref = CGImageCreate(tx, ty,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpaceRef, bitmapInfo, provider,
NULL, false,
kCGRenderingIntentDefault);
/* ... lots of stuff cut out here ... */
UIImage* image = [[UIImage alloc] initWithCGImage:iref];