纹理的iPhone UIImage有灰色而不是alpha

时间:2011-08-10 17:47:55

标签: iphone opengl-es

我正在使用以下代码从屏幕获取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)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

CGContextDrawImage不只是复制数据,而是将源图像绘制到目标图像上。所以在这一点上,它将使用你的alpha通道作为alpha通道作为alpha通道,而不仅仅是将其复制过来。

说实话,如果您实际上不想修改从OpenGL返回的数据,我对contextimage的意见有点困惑。我建议你切入:

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];