2012-03-11 27 views
5

Hiện tại tôi đang làm việc với một ứng dụng vẽ dựa trên GLpaint. Tiết kiệm màn hình hiện tại trở thành một nỗi đau bận rộn đối với tôi. Tôi có một ViewController, Trên đầu của bộ điều khiển xem tôi đã tải UIIMageView và UIView (PaintingView) của tôi. Bây giờ nó có vẻ như tôi đang vẽ trên đầu của UIImageView.Chức năng Tiết kiệm GLPaint (Lưu màn hình hiện tại với hình nền)

Tôi đã quản lý để có được bản vẽ hiện tại của mình với câu hỏi này GLPaint save image. Khi tôi cố gắng chụp bản vẽ hiện tại, tôi lấy bản vẽ của mình nhưng với màn hình màu đen. Những gì tôi mong muốn là bản vẽ của tôi với hình nền (UIImageView). Tôi có nên phủ lên UIView với UIImageView không?

Trả lời

2

Bạn nên tải hình ảnh của mình bằng cách sử dụng OpenGL, không phải UIKit (dưới dạng UIImageView). Nếu không, bạn chỉ có thể chụp OpenGLView dưới dạng hình ảnh riêng lẻ, cũng như Chế độ xem UIKit dưới dạng hình ảnh khác.

Để thực hiện việc này, bạn phải hiển thị hình ảnh của mình trong một Texture trong lớp PaintingView được cung cấp trong ví dụ GLpaint và sau đó tải nó bằng cách vẽ hình chữ nhật trên chế độ xem bản vẽ của bạn.

0

tôi sử dụng mã này để lấy hình ảnh của tôi từ 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; 
} 

Và này sáp nhập nó với một hình nền:

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

Something như thế này:

finalImage = [self mergeImage: BackgroundImage withImage [self glToUIImage]];

Các vấn đề liên quan