Ios5 GLPaint保存功能(用背景图像保存当前屏幕)

Ios5 GLPaint保存功能(用背景图像保存当前屏幕),ios5,opengl-es,Ios5,Opengl Es,目前,我正在使用基于GLpaint的绘图应用程序。保存当前屏幕对我来说是一件非常痛苦的事情。我有一个视图控制器,在视图控制器的顶部,我加载了我的UIIMageView和UIView(PaintingView)。现在看起来我正在UIImageView的顶部绘制 我已经设法用这个问题画出了我现在的画。 当我试图捕捉我的当前图形时,我得到了我的图形,但屏幕是黑色的。我想要的是我的背景图像(UIImageView)绘图。我应该用UIImageView覆盖UIView吗?您应该使用OpenGL而不是UIK

目前,我正在使用基于GLpaint的绘图应用程序。保存当前屏幕对我来说是一件非常痛苦的事情。我有一个视图控制器,在视图控制器的顶部,我加载了我的UIIMageView和UIView(PaintingView)。现在看起来我正在UIImageView的顶部绘制

我已经设法用这个问题画出了我现在的画。
当我试图捕捉我的当前图形时,我得到了我的图形,但屏幕是黑色的。我想要的是我的背景图像(UIImageView)绘图。我应该用UIImageView覆盖UIView吗?

您应该使用OpenGL而不是UIKit(作为UIImageView)加载图像。否则,您将只能将OpenGLView捕获为单个图像,以及将UIKit视图捕获为不同的图像


为此,您必须在GLpaint示例中提供的Paint view类中的纹理中渲染图像,然后通过在图形视图上绘制四边形来加载图像。

我使用以下代码从OpenGL获取图像:

-(BOOL)iPhoneRetina{
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?YES:NO;
}

void releasePixels(void *info, const void *data, size_t size) {
    free((void*)data);
}

-(UIImage *) glToUIImage{

    int imageWidth, imageHeight;

    int scale = [self iPhoneRetina]?2:1;

    imageWidth = self.frame.size.width*scale;
    imageHeight = self.frame.size.height*scale;

    NSInteger myDataLength = imageWidth * imageHeight * 4;

    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, imageWidth, imageHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // make data provider with data.
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releasePixels);

    // prep the ingredients
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * imageWidth;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo =  kCGImageAlphaPremultipliedLast;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    // make the cgimage

    CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    UIImage *myImage = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationDownMirrored]; //Render image flipped, since OpenGL's data is mirrored

    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpaceRef);

    CGDataProviderRelease(provider);

    return myImage;
}
这是一个将其与背景图像合并的方法:

-(UIImage*)mergeImage:(UIImage*)image1 withImage:(UIImage*)image2{

    CGSize size = image1.size;

    UIGraphicsBeginImageContextWithOptions(size, NO, 0);

    [image1 drawAtPoint:CGPointMake(0.0f, 0.0f)];
    [image2 drawAtPoint:CGPointMake(0.0f, 0.0f)];

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}
大概是这样的:

finalImage=[self mergeImage:BackgroundImage with image[self glToUIImage]]